Given a sorted integer array without duplicates, return the summary of its ranges.
Example 1:
Input: [0,1,2,4,5,7] Output: ["0->2","4->5","7"] Explanation: 0,1,2 form a continuous range; 4,5 form a continuous range.
Example 2:
Input: [0,2,3,4,6,8,9] Output: ["0","2->4","6","8->9"] Explanation: 2,3,4 form a continuous range; 8,9 form a continuous range.
class Solution { public List<String> summaryRanges(int[] nums) { int start = 0; int end = 0; int le = nums.length; List<String> res = new ArrayList<String>(); for(int i = 0; i < le; i++){ start = i; while(i + 1< le && nums[i+1] == nums[i] + 1){ end++; i++; } if(start != end) res.add(nums[start] + "->" + nums[end]); if(start == end) res.add(nums[start] + ""); end++; } return res; } }
双指针法,碉堡。貌似这种求首尾的题都可以用双指针法。
class Solution { public List<String> summaryRanges(int[] nums) { List<String> res = new ArrayList<>(); int n = nums.length; int start = 0, end = 0; for(int i = 0; i < n; i++) { start = i; end = i; while(i < n - 1 && nums[i+1] == nums[i] + 1) { i++; end++; } if(end != start) res.add(nums[start] + "->" + nums[end]); else res.add(nums[start] + ""); } return res; } }
emmmm 我觉得这样表达更符合正常思维
总结:
we used two pointers to set a consecutive increament subarray. Everytime we get the start and end == i, then till there's not nums[i+1] == nums[i] + 1, we stop. Then if the end index didn't change, it means the next element is not consecutive. Otherwise, we add a summary of the subarray.