Easy
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume no duplicates in the array.
Example 1:
Copy Input:
[1,3,5,6], 5
Output:
2
Example 2:
Copy Input:
[1,3,5,6], 2
Output:
1
Example 3:
Copy Input:
[1,3,5,6], 7
Output:
4
Example 4:
Copy Input:
[1,3,5,6], 0
Output:
0
Analysis
此题用Template 1,2都能比较简洁地得到答案。
其实要找的是第一个恰好比target大的数的index。
用template#1,最后剩余2个数的情况下,left在倒数第一循环中,因为right-left=1,所以mid其实就是left,因为比target小,则循环跳出后left其实就变成left+1,比target大了。
Solution
Template #1
Copy class Solution {
public int searchInsert ( int [] nums , int target) {
int left = 0 , right = nums . length - 1 ;
while (left <= right) {
int mid = left + (right - left) / 2 ;
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
right = mid - 1 ;
} else {
left = mid + 1 ;
}
}
return left;
}
}
Template #2
Copy class Solution {
public int searchInsert ( int [] nums , int target) {
int left = 0 , right = nums . length ;
while (left < right) {
int mid = left + (right - left) / 2 ;
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
right = mid;
} else {
left = mid + 1 ;
}
}
return left;
}
}
Template #3
Copy class Solution {
public int searchInsert ( int [] nums , int target) {
int left = 0 , right = nums . length - 1 ;
while (left + 1 < right) {
int mid = left + (right - left) / 2 ;
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
right = mid;
} else {
left = mid;
}
}
if (target > nums[right]) {
return right + 1 ;
}
if (target > nums[left]) {
return left + 1 ;
}
return left;
}
}