DESC1:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
CODE1:
JAVA:
class Solution { public int search(int[] nums, int target) { if (nums == null || nums.length==0) { return -1; } int left=0, right=nums.length-1; while (left<=right) { int mid = left + (right-left)/2; if (nums[mid] == target) { return mid; } else if (nums[mid] > target) { right = mid-1; } else { left = mid +1; } } return -1; } }
Python
class Solution: def search(self, nums: List[int], target: int) -> int: if not nums or len(nums) == 0: return -1 left=0 right=len(nums)-1 while left<=right: mid = left+(right-left)//2 if nums[mid] == target: return mid elif nums[mid] > target: right = mid-1 else: left = mid+1 return -1
NOTES1:
- 二分法
- 只有循环条件<=,不是<
DESC2:
题目描述
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
示例1
输入
[1,2,4,4,5],4
返回值
2
说明
从左到右,查找到第1个为4的,下标为2,返回2
示例2
输入
[1,2,4,4,5],3
返回值
-1
示例3
输入
[1,1,1,1,1],1
返回值
0
CODE2:
JAVA:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 如果目标值存在返回下标,否则返回 -1 * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ public int search (int[] nums, int target) { // write code here if (nums == null || nums.length == 0) { return -1; } int left=0; int right=nums.length-1; int mid =0; while (left<=right) { mid = left + (right-left)/2; if (nums[mid] == target) { while (mid!=0 && nums[mid-1] == target) { mid--; } return mid; } else if (nums[mid] > target) { right = mid-1; } else { left = mid+1; } } return -1; } }
NOTES2:
- 同code1思路一样,二分法查找目标值
- 因为有重复值,所以第一次查找到的目标值不一定是在最小索引位置,索引递归向左平移判断,知道找到第一个目标值即可