LeetCode -- Subarray sum equals K 子数组的和等于K

300 阅读1分钟

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.

给定int数组和目标值K,你需要找出所有和等于K的子数组的个数。 比如:

Input:nums = [1,1,1], k = 2
Output: 2

解决办法1,Brute Force暴力法,i从下标0-length-1,j从i-length-1,每次计算子数组(i,j)是否和等于k即可。时间复杂度O(N),空间复杂度O(1).

int subarraySum(int[] nums,int k){
    int answer = 0;
    int sum = 0;
    for(int i=0; i<nums.length; i++){
        sum = 0;
        for(int j = i; j<nums.length; j++){
            sum += nums[j];
            if(sum == k){
                anser++;
            }
        }
    }
}

##解决方法2:使用HashMap,存储的是从下标0到length-1,键为数组和,值为从0开始的数组个数。所以当计算到下标j时,此时假设和为sum,那么如果满足sum[i]也就是从0到下标i的数组和为sum-k,那么数组(i,j)就满足和为k。这个解题思路,就是把求和为K的子数组,转化为求解数组(0,j)中,是否有(0,i)等于sum-k的问题了。时间复杂度O(N),空间复杂度O(N).

int subarraySum(int[] nums,int k){
    int answer = 0;
    Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    int sum = 0;
    map.put(0,1);
    for(int i=0; i<nums.length; i++){
        sum += nums[i];
        int need = sum-k;
        if(map.containsKey(need)){
            answer += map.get(need);
        }
        map.put(sum,map.getOrDefault(sum,0)+1);
    }
    return answer;
}