给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
1 2 3
| 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4
|
示例 2:
1 2 3
| 输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
|
提示:
- 你可以假设
nums
中的所有元素是不重复的。
n
将在 [1, 10000]
之间。
nums
的每个元素都将在 [-9999, 9999]
之间。
左闭右闭区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public int search(int[] nums, int target) { if(nums == null || nums.length == 0){ return -1; } int left = 0; int right = nums.length-1; while(left<=right){ int mid = (left + right)/2; if(target == nums[mid]){ return mid; }else if(target > nums[mid]){ left = mid + 1; }else if(target < nums[mid]){ right = mid - 1; } } return -1; } }
|
左闭右开区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int search(int[] nums, int target) { int left = 0, right = nums.length; while (left < right) { int mid = (left + right) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else if (nums[mid] > target) right = mid; } return -1; } }
|
左开右闭区间
但要注意left = mid这个操作可能会导致死循环,比如left = 0, right = 1 , 那么mid = (left + right)/ 2 就永远等于 0,导致死循环,故要(left + right + 1) / 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int search(int[] nums, int target) { int left = -1, right = nums.length-1; while (left < right) { int mid = (left + right + 1) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid; else if (nums[mid] > target) right = mid - 1; } return -1; } }
|
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
左闭右闭区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length-1; int ans = 0; while(left <= right){ int mid = ((right - left) >> 1) + left; if(nums[mid] < target){ left = mid + 1; }else{ right = mid - 1; } } return left; } }
|
左闭右开区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length; int ans = 0; while(left < right){ int mid = ((right - left) >> 1) + left; if(nums[mid] < target){ left = mid + 1; }else{ right = mid; } } return left; } }
|
左开右闭区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int searchInsert(int[] nums, int target) { int left = -1; int right = nums.length-1; int ans = 0; while(left < right){ int mid = ((right - left + 1) >> 1) + left; if(nums[mid] < target){ left = mid; }else{ right = mid-1; } } return left + 1; } }
|