首页 > 试题广场 >

二分查找-II

[编程题]二分查找-II
  • 热度指数:190738 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)长度为n的整型数组 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
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 mid = nums.length / 2;
        if (nums[mid] >= target){
            for(int i=0;i <= mid;i++) if(nums[i] == target) return i;
        } else {
            for(int i=mid;i < nums.length;i++) if(nums[i] == target) return i;
        }
        return -1;
    }
}

发表于 2024-04-13 11:22:20 回复(0)
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
        // 1. 找中间值,和target进行比对
        // 2. 中间值>= target :-> right = middle
        // 3. 中间值< target :-> left = middle +1;
        // 4. left == right 时,nums[middle] == target是第一个值为target的目标值
        // 5. 否则,不存在该值,返回-1

        int res = -1;

        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int middle = left + ((right - left) >> 1);
            // 左右相等,属于算到最后
            if (left == right ) {
                // 此时,如果一致,说明数组存在目标值,且找到最左侧的该值
                if (nums[middle] != target) {
                    return -1;
                }
                //不一致,说明不存在该target
                return left;
            }

            if (nums[middle] >= target) {
                right = middle;
            } else {
                left = middle + 1;
            }
        }

        return res;
    }
}
发表于 2023-03-06 15:15:03 回复(0)
    public int search (int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] >= target) {
                right = mid - 1;
            }
        }
        if (left == nums.length) {
            return -1;
        }
        // 直接返回
        return nums[left] == target ? left : -1;
    }

发表于 2023-01-31 23:26:56 回复(0)
public int search (int[] nums, int target) {
    int low = 0;
    int high = nums.length - 1;
    int mid;
    while(low <= high) {
        mid = (low + high) / 2;
        if(nums[mid] == target) {
            for(int i = mid - 1; i >= 0; i--) {
                if(nums[mid] != nums[i]) {
                    return i + 1;
                }
            }
            return 0;
        } else if(target > nums[mid]) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;
}
发表于 2022-02-10 20:06:36 回复(0)
   public int search (int[] nums, int target) {
        if(nums==null||nums.length==0)
            return -1;
        if(nums[0]==target) {
            return 0;
        }
        int start = 0;
        int end = nums.length-1;
        int num = end;//记录最左出现的位置
       for (int i = start; i <=end+1; i++) {
         int mid = start+((end-start)>>1);
         if(nums[mid]==target) {
             end = mid-1;
             if(mid<num) {
                 num = mid;
             }
             if(num==0)
                 break;
             else
                 i--;
         }
         if(nums[mid]>target) {
             end = mid-1;
         }
         if(nums[mid]<target) {
             start = mid+1;
         }
    }
       if(num==nums.length-1&&nums[nums.length-1]!=target) {
           return -1;
       }
        return num;
    }
写的太麻烦了感觉
发表于 2022-01-19 09:43:19 回复(0)
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, right = nums.length - 1;
        while(left <= right) {
            //注意mid的求法
            int mid = left + (right - left) >> 1;
            //注意中间元素与目标元素比较
            if(nums[mid] >= target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
            if(nums[left] == target) {
                return left;
            }
            //不要忘记累加操作
            left++;
            right++;
        }
        return -1;
    }
}

发表于 2022-01-10 09:56:32 回复(3)
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
        //1.直接循环(不符合题意)
//         for(int i=0;i<nums.length;i++){
//             if(nums[i] == target)return i;
//         }
//         return -1;
        //递归
        //第一个下标
        int i = 0;
        //最后一个下标
        int j = nums.length-1;
        if(nums.length>0){
            return this.digui(nums,i,j,target);
        }else{
            return -1;
        }
        
    }
    
    public int digui(int[] nums, int i, int j, int target){
        if(j<i){
            return -1;
        }else if(j==i){
            //一共就一个的情况
            return nums[i] == target? i:-1;
        }else{
            //多个的情况
            //中间下标
            int k = j/2;
            //如果中间下标的值大于target,往前找
            if(nums[k] > target){
                return digui(nums,i,k-1,target);
            }else if(nums[k] < target){
            //如果中间值小于target,往后找
                return digui(nums,k+1,j,target);
            }else{
                //等于的情况,还得往前找
                int one = k;
//                 int houxu = digui(nums,i,k-1,target);
//                 if(houxu != -1){return houxu;}
//                 else {return one;}
                while(one > 0 && nums[one-1] == target){
                    --one;
                }
                return one;
            }
            
        }
        
    }
}
发表于 2022-01-07 11:20:16 回复(0)
import java.util.*;
public class Solution {
    public int search (int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            if(nums[i]==target){
                return i;
            }
        }
        return -1;
    }
}
发表于 2021-12-03 15:12:40 回复(1)
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
        for(int i=0;i<nums.length;i++){
          if(nums[i]==target){
              return i;
              
          }
           
        }
        return -1;
    }
}

发表于 2021-11-29 20:42:20 回复(1)
public int search (int[] nums, int target) {
        // write code here
        int startIndex = 0;
        int endIndex = nums.length-1;
        int midIndex = 0;
        while(startIndex<=endIndex){
            midIndex = (startIndex+endIndex)/2;
            if(nums[midIndex]==target){
                while(midIndex!=0&&nums[midIndex-1] == nums[midIndex]){
                    --midIndex;
                }
                return midIndex;
            }else if(nums[midIndex]>target){
                endIndex = midIndex-1;
            }else if(nums[midIndex]<target){
                startIndex = midIndex+1;
            }
          }
         return -1;
       }
发表于 2021-11-28 16:51:24 回复(0)
测试
发表于 2021-11-12 15:55:55 回复(0)
import java.util.*;


public class Solution {

    public int search (int[] nums, int target) {
     int i=nums.length;
        int a=0;int b=i;
        if(i==0){
            return -1;
        }
        else{
        while(a!=b){
            int c=(a+b)/2;
            if(target>nums[c]){
            a=c+1;
            }
            else{
            b=c;
            }
        }
    if(target!=nums[a]){
        return -1;
    }
        else{
            return a;
        }
        }
    }
}

发表于 2021-11-03 00:52:47 回复(0)
 for(int i=0;i<nums.length;i++){
            if(target==nums[i]){ 
                return i;
            }  
        }
        return -1;
    }
发表于 2021-10-22 18:16:50 回复(0)
二分法基础上增加左边界的判断
public class Solution {
    // [1, 2, 4, 3, 5]
    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 / 2 此种用***超时
            int mid = left + right >> 1;
            if (nums[mid] >= target) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        if (nums[left] == target) {
            return left;
        } else {
            return -1;
        }
    }
}


发表于 2021-10-10 20:58:56 回复(0)

思路:利用while循环,设置左右指针left,right。跳出循环的条件为left>right。mid = (left + right) / 2; 当中间值大于target,将left指针设置为mid + 1。当中间值小于target,将right指针设置为mid - 1;
当找到和target值相同的值时,需要遍历前面是否有相同的值,最小的为所要求的结果。单循环条件一定要注意加上mid <= 1。

public int search (int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = (right + left) / 2;
            if (nums[mid] == target) {
                while (mid >= 1 && nums[mid] == nums[mid - 1]) {
                    mid--;
                }
                return mid;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
发表于 2021-09-29 23:03:57 回复(0)
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
        int low = 0,high = nums.length-1;
           int index = -1;
        while(low <= high){
//             int mid = low + (high - low) / 2;
            if(nums[low] == target){
                index = low;
                break;
            }else if(nums[low] < target){
                low++;
              
            }else {
                high--;
            }
        }
        return index;
    }
}

发表于 2021-09-28 20:04:56 回复(1)

问题信息

难度:
54条回答 5900浏览

热门推荐

通过挑战的用户

查看代码
二分查找-II