java数据结构与算法之连续子数组问题
Posted wen-pan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构与算法之连续子数组问题相关的知识,希望对你有一定的参考价值。
①、问题描述
给定一个数组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;
以上是关于java数据结构与算法之连续子数组问题的主要内容,如果未能解决你的问题,请参考以下文章