我是靠谱客的博主 耍酷心锁,最近开发中收集的这篇文章主要介绍和为k的子数组和为k的子数组的总个数前缀和+哈希表代码实现未排序数组中累加和未给定值k的最长子数组长度解题思路实现代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

和为k的子数组的总个数

前缀和+哈希表

  • 定义pre[i]为[0...i]里所有数的和,则pre[i] = pre[i-1] + nums[i]
  • [j...i]这个子数组的和为k等价于:pre[i] - pre[j-1] = k,可以转化为pre[j-1] = pre[i] - k
  • 当计算以i为结尾的和为k的连续子数组的时候只要统计有多少个前缀和为pre[i]-k的pre[j]即可
  • 建立hash表map.以和(pre)为键,出现的次数为value,从左往右更新map,就可以在O(1)的时间内得到以i为结尾的答案mp[pre[i]-k]
  • 最后的答案就为所有下标结尾和为k的子数组个数之和。
  • 值得注意的是:因为pre[i]只和pre[i-1]有关,因此可以不用真正建立pre数组,直接用pre变量来记录pre[i-1]即可。

代码实现

class Solution {
    public int subarraySum(int[] nums, int k) {
        if(nums == null || nums.length == 0){
            return 0;
        }
        int pre = 0;
        int ans = 0;
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);//错误:少了这行代码
        for(int i = 0; i < nums.length; i++){
            pre += nums[i];
            int target = pre - k;
            ans += map.getOrDefault(target, 0);
            map.put(pre, map.getOrDefault(pre, 0) + 1);
        }
        return ans;
    }
}

未排序数组中累加和未给定值k的最长子数组长度

解题思路

  • 和上一题类似,只是map集合中存的不再是前缀和出现的个数,而是前缀和最早出现的位置下标。

实现代码

import java.util.*;


public class Solution {
    /**
     * max length of the subarray sum = k
     * @param arr int整型一维数组 the array
     * @param k int整型 target
     * @return int整型
     */
    private int res = Integer.MIN_VALUE;
    public int maxlenEqualK (int[] arr, int k) {
        // write code here
       //利用前缀和+哈希表实现
        if(arr == null || arr.length == 0){
            return Integer.MIN_VALUE;
        }
        int pre = 0;
        //利用map存储,key为前缀和, value为最早的那个下标
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        for(int i = 0; i < arr.length; i++){
            pre += arr[i];
            //target为待查找的前缀和
            int target = pre - k;
            if(map.containsKey(target)){
                int start = map.get(target);
                res = Math.max(res, i - start);
            }
            else{
                //在不包含的情况下,只有当集合中之前不存在对应前缀和的情况下,才放入
               if(!map.containsKey(pre)){
                   map.put(pre, i);
               }
            }
        }
        return res;
    }
}

 

最后

以上就是耍酷心锁为你收集整理的和为k的子数组和为k的子数组的总个数前缀和+哈希表代码实现未排序数组中累加和未给定值k的最长子数组长度解题思路实现代码的全部内容,希望文章能够帮你解决和为k的子数组和为k的子数组的总个数前缀和+哈希表代码实现未排序数组中累加和未给定值k的最长子数组长度解题思路实现代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部