题1:二分查找 I

题目来源:[NC]160. 二分查找 I

题目

请实现有 无重复 数字的升序数组的二分查找

给定一个 元素有序的(升序)长度为 n 的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中出现的 target 的下标,如果目标值存在返回下标,否则返回 -1

数据范围:🍗二分查找合集 - 图1
进阶:时间复杂度 🍗二分查找合集 - 图2,空间复杂度 🍗二分查找合集 - 图3

时间复杂度:🍗二分查找合集 - 图4,其中 🍗二分查找合集 - 图5 是数组的长度。

空间复杂度:🍗二分查找合集 - 图6

我的代码

  1. public class Solution {
  2. public int search (int[] nums, int target) {
  3. // write code here
  4. int start=0;
  5. int end =nums.length-1;
  6. while(start<=end){
  7. int mid=start+(end-start)/2;
  8. if(nums[mid]==target){
  9. return mid;
  10. }
  11. else if(nums[mid]<target){
  12. start=mid+1;
  13. }else{//mid>target
  14. end=mid-1;
  15. }
  16. }
  17. return -1;
  18. }
  19. }

题2:二分查找 II

题目来源:[NC]105. 二分查找 II

题目

请实现有 重复 数字的升序数组的二分查找

给定一个 元素有序的(升序)长度为 n 的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的 target 的下标,如果目标值存在返回下标,否则返回 -1

数据范围:🍗二分查找合集 - 图7
进阶:时间复杂度 🍗二分查找合集 - 图8,空间复杂度 🍗二分查找合集 - 图9

示例1

输入:[1,2,4,4,5],4 返回值:2 说明: 从左到右,查找到第 1 个为 4 的,下标为 2 ,返回 2

时间复杂度:🍗二分查找合集 - 图10,其中 🍗二分查找合集 - 图11 是数组的长度。

空间复杂度:🍗二分查找合集 - 图12

我的代码

  1. public class Solution {
  2. public int search (int[] nums, int target) {
  3. int start=0;
  4. int end =nums.length-1;
  5. while(start<=end){
  6. if(nums[start]==target)return start; //1. 此处相等一定下标最小
  7. int mid=start+(end-start)/2;
  8. if(nums[mid]==target){ //2. 找到也继续向左区间找,但不丢失mid
  9. end=mid;
  10. }
  11. else if(nums[mid]<target){
  12. start=mid+1;
  13. }else{
  14. end=mid-1;
  15. }
  16. }
  17. return -1;
  18. }
  19. }