Array中的subarray问题
来源:互联网 发布:软件项目质量管理问题 编辑:程序博客网 时间:2024/06/07 00:07
该题型多采用prefixSum的方法:
(一)Maximum Subarray (Frequent ++)
http://www.lintcode.com/en/problem/maximum-subarray/
题目:找到数组中总和最大的子集并返回该子集总和;
解答:将该数组的prefixSum存储在新数组中(亦可覆盖原数组节省空间),因为sum(i ~ j) = prefixSum(j + 1) - prefixSum(i),遍历prefixSum数组, 用当前元素减去已知最小元素依次比较得到结果;
改进:可以把求prefixSum的循环和找最大的循环合并成一个
代码:
public class Solution {
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
public int maxSubArray(int[] nums) {
// write your code
int len = nums.length;
int[] prefixSum = new int[len];
int sum = 0;
for (int i = 0; i < len; i++) {
sum += nums[i];
prefixSum[i] = sum;
}
int res = nums[0];
int min = 0;
for (int i = 0; i < len; i++) {
int tempSum = prefixSum[i] - min;
res = tempSum > res ? tempSum : res;
min = prefixSum[i] < min ? prefixSum[i] : min;
}
return res;
}
}
/**
* @param nums: A list of integers
* @return: A list of integers includes the index of the first number
* and the index of the last number
*/
public ArrayList<Integer> subarraySum(int[] nums) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer>();
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sum == 0) {
res.add(0);
res.add(i);
break;
}
if (map.containsKey(sum)) {
res.add(map.get(sum) + 1);
res.add(i);
break;
} else {
map.put(sum, i);
}
}
return res;
}
}
/**
* @param nums: A list of integers
* @return: A list of integers includes the index of the first number
* and the index of the last number
*/
public int[] subarraySumClosest(int[] nums) {
// write your code here
int[] res = new int[2];
int[] prefixSum = new int[nums.length + 1];
int diff = Integer.MAX_VALUE;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
prefixSum[i + 1] = prefixSum[i] + nums[i];
if (!map.containsKey(prefixSum[i])) {
map.put(prefixSum[i], i);
} else {
res[0] = map.get(prefixSum[i]);
res[1] = i - 1;
return res;
}
}
if (!map.containsKey(prefixSum[nums.length])) {
map.put(prefixSum[nums.length], nums.length);
} else {
res[0] = map.get(prefixSum[nums.length]);
res[1] = nums.length - 1;
return res;
}
Arrays.sort(prefixSum);
for (int i = 1; i < nums.length + 1; i++) {
if (prefixSum[i] - prefixSum[i - 1] < diff) {
int i1 = map.get(prefixSum[i]);
int i2 = map.get(prefixSum[i - 1]);
diff = prefixSum[i] - prefixSum[i - 1];
res[0] = Math.min(i1, i2);
res[1] = Math.max(i1, i2) - 1;
}
}
return res;
}
}
- Array中的subarray问题
- LeetCode - Array - Maximum Subarray
- [Array]Minimum Size Subarray Sum
- LeetCode刷题【Array】 Maximum Subarray
- leetcode.array--53. Maximum Subarray
- Split array into two equal sum subArray
- [Array] 560Subarray sum Equal k
- LeetCode刷题【Array】 Shortest Unsorted Continuous Subarray
- LeetCode刷题【Array】 Maximum Average Subarray I
- LeetCode刷题【Array】Minimum Size Subarray Sum
- Maximum Subarray问题
- Maximum Subarray问题及解法
- Leetcode之Maximum Subarray 问题
- Array原型属性在for in循环中的"问题"
- LeetCode 523. Continuous Subarray sum和 525. Contiguous Array和560. Subarray Sum Equals K
- Find the maximum subarray XOR in a given array
- 【leetcode】Array—— Minimum Size Subarray Sum(209)
- 【leetcode】Array—— Maximum Subarray(53)
- json权限父子包含,层层迭代
- CF835A-Key races
- C语言math库#include<math.h>
- 再谈正向代理
- [Leetcode] 325. Maximum Size Subarray Sum Equals k 解题报告
- Array中的subarray问题
- LINUX共享内存使用常见陷阱与分析
- HDU 6034 Balala Power!
- The Linux Command Line中文版
- C语言stdio库(#include<stdio.h>)
- async/await 异步函数
- C语言stdlib库(#include<stdlib.h>)
- redis主从、哨兵、集群
- CodeForces