您的位置:首页 > 其它

[刷题]Subarray Sum Closest

2015-09-16 14:56 295 查看
[LintCode]Subarray Sum Closest

Version 1 O(n^2) 超时

public class Solution {
/**
* @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> subarraySumClosest(int[] nums) {
// 2015-09-16 O(n^2)
ArrayList<Integer> list = new ArrayList<>();
if (nums == null || nums.length < 1) {
return list;
}

int[] sum = new int[nums.length + 1];
sum[0] = 0;

int minSub = Math.abs(nums[0]);
int start = 0;
int end = 0;

for (int i = 0; i < nums.length; i++) {
sum[i + 1] = nums[i] + sum[i];
for (int j = 0; j < i + 1; j++) {
int absSub = Math.abs(sum[i + 1] - sum[j]);
if (absSub < minSub) {
minSub = absSub;
start = j;
end = i;
}
}
}

list.add(start);
list.add(end);
return list;
}
}


Version 2 O(nlogn)

public class Solution {
/**
* @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
*/

class Pair {
int sum;
int index;
public Pair(int s, int i) {
sum = s;
index = i;
}
}

public ArrayList<Integer> subarraySumClosest(int[] nums) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer> ();
if (nums == null || nums.length == 0) {
return res;
}

int len = nums.length;
if(len == 1) {
res.add(0);
res.add(0);
return res;
}

Pair[] sums = new Pair[len+1];
int prev = 0;
sums[0] = new Pair(0, 0);

for (int i = 1; i <= len; i++) {
sums[i] = new Pair(prev + nums[i-1], i);
prev = sums[i].sum;
}
// 排序
Arrays.sort(sums, new Comparator<Pair>() {
public int compare(Pair a, Pair b) {
return a.sum - b.sum;
}
});

int ans = Integer.MAX_VALUE;
for (int i = 1; i <= len; i++) {

if (ans > sums[i].sum - sums[i-1].sum) {
ans = sums[i].sum - sums[i-1].sum;
res.clear();
int[] temp = new int[] {sums[i].index - 1, sums[i - 1].index - 1};
Arrays.sort(temp);
res.add(temp[0] + 1);
res.add(temp[1]);
}
}

return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: