算法,求数组中的元素和为某个数

1、更简单一点的题目:判断总共n个数,从1-n,找出其中和为 S的一段序列

这个题目采用的是:用维持一个窗口,如果窗口中的数小于了S就像S向右扩张,如果大于S就把左边的数去掉

import java.util.ArrayList;
public class Solution {
   public ArrayList> FindContinuousSequence(int sum) {
        ArrayList> 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 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 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);
            }
        }
    }


}

你可能感兴趣的:(算法,java)