1. 程式人生 > >演算法:在一個集合中選取所有符合條件的元素組合

演算法:在一個集合中選取所有符合條件的元素組合

做了好幾個題目都遇到題中的場景。於是寫了個演算法,元素組合條件是求和。
演算法能適應的場景要求組合條件可以拆分的,有對應的逆運算。

程式碼實現的是取三個元素和在40~60之間的組合。迴圈n(testList.size())次可以獲取所有符合條件的組合。

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;


public class JunitTest {

    @Test
    public void test() throws InterruptedException {
        List<Integer> testList = new
ArrayList<Integer>(); testList.add(5); testList.add(10); testList.add(15); testList.add(20); testList.add(25); testList.add(30); testList.add(35); System.out.println(select(40, 60, 3, testList)); } //遞迴選擇指定個數 符合條件的所有組合 private
List<List<Integer>> select(int min, int max, int count, List<Integer> resourceList) { if (count == 1) { return eligible(min, max, resourceList); } else { List<List<Integer>> rsList = new ArrayList<List<Integer>>(); Integer i = resourceList.remove(0
); if (resourceList.size() >= count) { List<Integer> tmpList = new ArrayList<Integer>(resourceList); //去掉第一個元素 剩餘元素中的組合 rsList.addAll(select(min, max, count, tmpList)); } //個數--,條件拆分 min - i, max - i rsList.addAll(assembly(i, select(min - i, max - i, --count, resourceList))); return rsList; } } //選擇符合條件的結果 private List<List<Integer>> eligible(int min, int max, List<Integer> resourceList) { List<List<Integer>> rsList = new ArrayList<List<Integer>>(); for (Integer i : resourceList) { if (i >= min && i <= max) { List<Integer> tmp = new ArrayList<Integer>(); tmp.add(i); rsList.add(tmp); } } return rsList; } //組合 private List<List<Integer>> assembly(Integer base, List<List<Integer>> resourceList) { List<List<Integer>> rsList = new ArrayList<List<Integer>>(); for (List<Integer> list : resourceList) { list.add(base); rsList.add(list); } return rsList; } }

相關推薦

演算法一個集合選取所有符合條件元素組合

做了好幾個題目都遇到題中的場景。於是寫了個演算法,元素組合條件是求和。 演算法能適應的場景要求組合條件可以拆分的,有對應的逆運算。 程式碼實現的是取三個元素和在40~60之間的組合。迴圈n(testList.size())次可以獲取所有符合條件的組合。

java8stream操作集合獲取符合條件元素

List<Student> students = new ArrayList<>(); students.add(new Student(1,"張三",

課程作業02將課程所有動手動腦的問題以及課後實驗性的問題,整理成一篇文檔。

運算符 示例 turn 整理 .cn 輸出結果 ole 輸出 兩個 問題1:一個Java類文件中真的只能有一個公有類嗎?請使用Ecplise或javac檢測一下以下代碼,有錯嗎? 一個java類文件中只能有一個公有類。用Ecplise測試,當public類嵌套在publi

一個集合類的某一欄位遍歷到另一個集合

        我們在開發中經常會遇到這種情況,就是在查詢一個列表的時候,可能會需要將另一個表中的某些欄位拼接到這一個列表中,在這種時候,如果是取到列表之後,然後根據某一個欄位再去一個一個的查詢的話,就會很費資源,介面也會變的很慢。   &nbs

資料庫SQL實踐49針對庫所有表生成select count(*)對應的SQL語句

思路: 列出資料庫中所有表名: select name from sqlite_master where type='table' 用||連線 "select count(*) from" || name || ";"從而實現連線 select "select count(*)

Java ArrayList使用技巧 - 從第一個List去除所有第二個List與之重複的元素

需求:從 mAllList 中去除所有 mSubList 中與之重複的元素 測試資料:mAllList 中包含100000個無序無重複字串,mSubList 中包含50000個無序無重複字串   方法一、ArrayList中提供的removeAll方法(效率最低) mAllList

CSS佈局一個div使兩個列元素自動等高

html: <body> <div class="content-wrapper"> <div class="left"> <h1>簡歷</h1> </div> <

已知線性表元素以值遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表值相同的多餘元素

/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構 * 設計一個演算法,刪除表中值相同的多餘元素 * 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間 */ #include<stdio.h> #inclu

Map.values方法——獲取Map集合所有鍵值物件

該方法用來獲取Map集合中的所有鍵值物件,這些鍵值物件將存放在另一個集合物件中。 語法  values()  示例  本示例建立一個Map集合物件並新增一些內容,然後呼叫values方法獲取包含所有鍵值的集合物件,並輸出這些鍵值資訊。   publ

Dijkstra演算法一個節點到其他所有節點的最短路徑)

Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料

常見演算法C語言連結串列的操作(建立,插入,刪除,輸出)

連結串列中最簡單的一種是單向連結串列,它包含兩個域,一個資訊域和一個指標域。這個連結指向列表中的下一個節點,而最後一個節點則指向一個空值。 一個單向連結串列包含兩個值: 當前節點的值和一個指向下一個節點的連結 一個單向連結串列的節點被分成兩個部分。第一個部分儲存或者顯示關於

Python練習題2提取列表所有數字,包括字串的數字 target = ['25',5,'a',1,2,'b',4,5,'A','python','3.6']

方法一:使用type(eval())函式判斷型別,再用try-except-else處理異常 1 def num_trans(): 2 """使用eval()函式判斷""" 3 target = ['25',5,'a',1,2,'b',4,5,'A','python','3.6'

JS實現去除一個字串所有標點和空格

這是今天做練習的時候碰到的。 有兩種辦法:一是先將要處理的字串分割成陣列,再用filter濾去陣列中的標點和空格(filter對於回撥函式返回true的項會保留在陣列中,返回false的會被濾出陣列),最後再把陣列轉成字串。下面是實現方法: function

計算機圖形學 學習筆記(一)概述,直線掃描轉換演算法DDA,點畫線演算法,Bresenham演算法

前言 感謝中國農大 趙明老師的分享~ 現在我要為我自己走向遊戲程式設計打下基石~ 1 計算機圖形學概論 1.1 計算機圖形學課程簡介 《計算機圖形學》是計算機、地理資訊系統、應用數學、機械、建築等專業本科教學中的一門重要的專業基礎課 如影

常見演算法C語言的排序演算法--氣泡排序,選擇排序,希爾排序

氣泡排序(Bubble Sort,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小

hive使用case、if一個region統計業務(hive條件函式case、if、COALESCE語法介紹:CONDITIONAL FUNCTIONS IN HIVE)

CREATE TABLE test_lmj_mdm_tmp AS SELECT guid, CONCAT('adn_',adn_id) AS adn, CONCAT('time_',substr(createtime,12,2)) AS hour, CONCAT('os_',os_id) AS os, cas

Kaggle爆文一個框架解決幾乎所有機器學習問題

problem pan port 例子 過程 保持數據 檢驗 block p s 上周一個叫 Abhishek Thakur 的數據科學家,在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Ma