1. 程式人生 > >演算法,求陣列中的元素和為某個數

演算法,求陣列中的元素和為某個數

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); } } } }