不难看出我们可以用一个 "carry" 来表示我们目前 interval 的覆盖结果;比如 +4 和 -2 覆盖的地方,净增长一定是 +2,就像扫描线的时候带着当前的 interval / building 一样。同时我们需要定义一个 “起始” 和 “结束” ,代表着当前区间的覆盖结果,对 carry 值进行修正。
public class Solution {
public int[] getModifiedArray(int length, int[][] updates) {
if(length <= 0) return new int[0];
int[] rst = new int[length];
for(int[] update : updates){
int start = update[0];
int end = update[1];
int val = update[2];
rst[start] += val;
if(end + 1 < length) rst[end + 1] -= val;
}
int carry = 0;
for(int i = 0; i < length; i++){
rst[i] += carry;
carry = rst[i];
}
return rst;
}
}
public int longestConsecutive(int[] nums) {
if(nums == null || nums.length == 0) return 0;
HashMap<Integer, Integer> map = new HashMap<>();
int maxLen = 0;
for(int i = 0; i < nums.length; i++){
int num = nums[i];
if(map.containsKey(num)) continue;
int leftBound = map.containsKey(num - 1) ? map.get(num - 1): 0;
int rightBound = map.containsKey(num + 1) ? map.get(num + 1): 0;
int sum = leftBound + rightBound + 1;
map.put(num, sum);
maxLen = Math.max(sum, maxLen);
if(leftBound != 0) map.put(num - leftBound, sum);
if(rightBound != 0) map.put(num + rightBound, sum);
}
return maxLen;
}