import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param k int整型 * @return int整型二维数组 */ public int[][] subarraySum (int[] nums, int k) { // write code here Map<Integer,Integer> map = new HashMap<>(); int preSum = 0; map.put(0,-1); TreeSet<int[]> set = new TreeSet<>((o1, o2) -> { if(o1[0] != o2[0]) { return o1[0] - o2[0]; }else { return o1.length - o2.length; } }); for(int i=0;i<nums.length;i++){ preSum+=nums[i]; if(map.containsKey(preSum-k)){ int value = map.get(preSum-k); set.add(Arrays.copyOfRange(nums,value+1,i+1)); } map.put(preSum,i); } int[][] arr = new int[set.size()][]; set.toArray(arr); return arr; } }
本题主要考察的知识点是哈希表的应用,所用编程语言是java。
我们可以将数组前缀和对应的下标存在哈希map当中,然后根据对应下标前缀和相减得到连续数组之和,根据前缀和相减然后与k作比较是否相等。其实我们也可以利用前缀和数组来解决此题。