演算法,求陣列中的元素和為某個數
阿新 • • 發佈:2019-01-07
1、更簡單一點的題目:判斷總共n個數,從1-n,找出其中和為 S的一段序列
這個題目採用的是:用維持一個視窗,如果視窗中的數小於了S就像S向右擴張,如果大於S就把左邊的數去掉
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
for (int i = (int) Math.sqrt(sum * 2); i >= 2; i--) {
if (((i & 1) == 1 && sum % i == 0) || (sum % i) * 2 == i) {
ArrayList<Integer> list = new ArrayList<>();
for (int j = 0, k = (sum / i) - (i-1)/ 2; j< i; j++, k++) {
list.add(k);
}
listAll.add(list);
}
}
return listAll;
}
}
2、陣列中的元素是任意的元素,判斷陣列中能組合成S的所有序列,就算數字不同,下標相同也算
import java.util.*;
/**
* @Author: yd
* @Date: 2018/9/9 15:52
* @Version 1.0
*/
class Main {
private int count;//表示的是總的組合數
private int TARGET_SUM;//表示和為這個數
private int addAll = 0;//已經加入集合的所有元素的累加和
private List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
new Main().getInfo();
}
private void getInfo() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
TARGET_SUM = m;//為和賦值
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
}
getAll(array, 0, array.length);
System.out.println(count);
}
/**
* 獲取所有的組合數
*
* @param array 要查詢的陣列
* @param fromIndex 起始的座標
* @param endIndex 結束的座標
* @return 無返回值
*/
public void getAll(final int[] array, int fromIndex, int endIndex) {
if (addAll >= TARGET_SUM) {//判斷當前的元素與已經累加的元素的大小
if (addAll == TARGET_SUM) {
count++;
}
return;//不需要進行繼續執行,因為累加的元素已經比規定的元素還大
}
for (int i = fromIndex; i < endIndex; i++) {
if (addAll + array[i] <= TARGET_SUM) {
list.add(array[i]);
addAll += array[i];
getAll(array, i + 1, endIndex);
addAll -= list.remove(list.size() - 1);
}
}
}
}