import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param k int整型
* @return int整型二维数组
*/
public int[][] subarraySum (int[] nums, int k) {
// write code here
List<List<Integer>> result = new ArrayList<>();
HashMap<String, List<Integer>> resultMap = new HashMap<>();
int size = nums.length;
for (int left = 0; left < size; left++) {
int sum = 0;
for (int right = left; right < size; right++) {
sum += nums[right];
if (sum == k) {
List<Integer> subarray = new ArrayList<>();
for (int i = left; i <= right; i++) {
subarray.add(nums[i]);
}
StringBuilder sb = new StringBuilder();
for (int num : subarray) {
sb.append(num).append(",");
}
String subarrayStr = sb.toString();
if (!resultMap.containsKey(subarrayStr)) {
resultMap.put(subarrayStr, subarray);
result.add(subarray);
}
}
}
}
int[][] res = new int[result.size()][];
for (int i = 0; i < result.size(); i++) {
List<Integer> subarray = result.get(i);
res[i] = new int[subarray.size()];
for (int j = 0; j < subarray.size(); j++) {
res[i][j] = subarray.get(j);
}
}
return res;
}
}
使用的是Java语言。
该题考察的知识点是数组遍历和子数组求和。
- 使用HashMap
resultMap来存储已经存在的子数组的字符串表示和对应的子数组对象。 - 遍历数组
nums,使用两层循环,外层循环控制子数组的起始位置left,内层循环控制子数组的结束位置right。 - 在内层循环中,通过不断累加元素的和
sum,判断当前子数组的和是否等于k,如果相等,则找到了一个符合条件的子数组。 - 将符合条件的子数组存储在一个新的ArrayList
subarray中,并将其转换为字符串形式subarrayStr。 - 判断
resultMap中是否已经包含了相同的子数组,如果不包含,则将其加入resultMap和result中。 - 循环结束后,将
result转换成二维整型数组res返回。

京公网安备 11010502036488号