题目描述
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.
给定一个排序好的数组和target值,如果找到目标值就返回,如果没有找到就返回它在插入的时候应该有的位置。
You may assume no duplicates in the array.
数组元素不重复。
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
思路分析
二分查找的变种,而且是很简单的那种,只需要在找不到元素的时候考虑下该怎么做,例如Example 2,二分查找会沿着3-1,最后target > nums[mid],然后发现没有找到,所以需要上一步记录下mid + 1的位置,因此递归时需要额外的参数possible表示每次递归的下一次如果没有找到那么应该返回多少。
当二分查找去[start, mid - 1]找的时候,possible置为mid;
当二分查找去[mid + 1, end]找的时候,possible置为mid + 1;
代码实现
public class Solution {
/**
* 62 / 62 test cases passed.
* Status: Accepted
* Runtime: 5 ms
*
* @param nums
* @param target
* @return
*/
public int searchInsert(int[] nums, int target) {
return findPosition(nums, 0, nums.length - 1, target, -1);
}
public int findPosition(int[] nums, int start, int end, int target, int possible) {
if (start > end) {
return possible;
}
int mid = (start + end) / 2;
if (nums[mid] == target) {
return mid;
} else if (target < nums[mid]) {
return findPosition(nums, start, mid - 1, target, mid);
} else {
return findPosition(nums, mid + 1, end, target, mid + 1);
}
}
}
网友评论