For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"].
Idea: Straightforward. Scan the array from left to right, if a range is missing, store it in result. Take care if the range has only one element, “->” is not needed. To make the code looks clean, I used a class Range which represents the ranges.
Time: O(n) Space: O(1)
Code:
public class Solution{
public class Range{
int left;
int right;
public Range(int left, int right)
{
this.left=left;
this.right=right;
}
public String toString()
{
if(left==right)
return Integer.toString(left);
else
return Integer.toString(left)+"->"+Integer.toString(right);
}
}
public List<String> findMissingRanges(int[] A, int lower, int upper) {
List<String> result=new ArrayList<String>();
if(A.length==0)
{
Range tmp=new Range(lower,upper);
result.add(tmp.toString());
return result;
}
if(A[0]>lower)
{
Range tmp=new Range(lower,A[0]-1);
result.add(tmp.toString());
}
for(int i=1;i<A.length;i++)
{
if(A[i]>A[i-1]+1)
{
Range tmp=new Range(A[i-1]+1,A[i]-1);
result.add(tmp.toString());
}
}
if(A[A.length-1]<upper)
{
Range tmp=new Range(A[A.length-1]+1,upper);
result.add(tmp.toString());
}
return result;
}
}
No comments:
Post a Comment