①、问题描述
给定一个数组nums,0 < nums.length < 1000,请找出该数组的所有子数组并返回!!!
- 什么是连续子数组呢?比如原数组 nums = [1, 2, 3] 那么他的连续子数组有
- [1,2,3]、[1,2]、[1]、[2]、[3]、[2,3]
- [1,3]则不是他的连续子数组
②、类似题目
③、代码
// 测试代码
public static void main(String[] args) {
int[] ints = {100, 200, 300};
List<List<Integer>> allSubList = continuousSubList(ints);
System.out.println("ints的所有连续子数组为:" + allSubList);
}
/**
* 求arr的所有连续子数组
*/
public static List<List<Integer>> continuousSubList(int[] arr) {
List<List<Integer>> resultList = new ArrayList<>();
if (arr == null || arr.length < 1) {
return resultList;
}
// 对于每个位置都求包含他本身在内的所有连续子数组
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
// 从 i ~ j位置求得一个子数组
List<Integer> subList = new ArrayList<>();
resultList.add(subList);
for (int k = i; k <= j; k++) {
subList.add(arr[k]);
}
}
}
// 返回最终结果
return resultList;
}
④、再看一题
主要是为了练习求【连续子数组】的解题感觉!!!不是最优解
【题目一】给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的连续子数组的个数。
// 注意题意,这里是【连续子数组】个数并不是 【子数组】,注意区分
public int subarraySum(int[] nums, int k) {
if(nums == null || nums.length < 1){
return 0;
}
int count = 0;
int len = nums.length;
for(int i = 0; i < len; i++){
// 求由 i 位置开始(每个子数组必须包含i位置),向后的所有子数组
int sum = 0;
for(int j = i; j < len; j++){
sum += nums[j];
if(sum == k){
count++;
}
}
}
return count;
}
【题目二】给你一个整数数组 nums
,请你统计并返回该数组中【连续子数组】的个数。
/**
* 求arr的连续子数组的个数(解法1)
*/
public static int subArrayCount(int[] arr) {
if (arr == null) {
return 0;
}
int count = 0;
int len = arr.length;
//对于每一个i位置都求一遍他有多少个子数组(这里可以通过数学方法计算即可)
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
count++;
}
}
return count;
}
/**
* 求arr的连续子数组的个数(解法2)
*/
public static int subArrayCount2(int[] arr) {
if (arr == null) {
return 0;
}
int count = 0;
int len = arr.length;
//对于每一个i位置都求一遍他有多少个子数组
for (int i = 0; i < len; i++) {
count += (len - i);
}
return count;
}