Leetcoe高频题(八) 我就不信邪了 LeetCode 二分法

这篇博客探讨了二分查找算法在不同场景下的应用,包括搜索插入位置、寻找峰值以及在特定数组操作中的使用。针对35题,算法找到目标值的正确插入位置;162题中,找到了数组中的峰值元素;NC48问题中,实现了二分查找的上限边界查找;在NC105题目中,算法在经过旋转的有序数组中高效地查找目标值。这些示例展示了二分查找的灵活性和效率。
摘要由CSDN通过智能技术生成


35. 搜索插入位置

在这里插入图片描述

class Solution {
  public int searchInsert(int[] nums, int target) {
    int high = nums.length - 1;
     int low = 0;
     while ( low <= high ) {
         int mid = (low + high ) >>1;
         if ( target > nums[mid]) {
             low = mid + 1;
         }else if ( target < nums[mid]) {
             high = mid - 1;
         }else {
             return mid;
         }
     }
     return low;
}
}

162. 寻找峰值

在这里插入图片描述

class Solution {
    public int findPeakElement(int[] nums) { 

     if(nums.length==0||nums==null) return -1;

     if(nums.length==1)  return 0;
 
       int l=0;
       int r=nums.length-1;

       while(l<r){
       int mid=(r-l)/2+l;
         if(nums[mid]<nums[mid+1]) l=mid+1;
         else r=mid;
       }
       return l;  

    }
}

NC48 二分查找

在这里插入图片描述

import java.util.*;


public class Solution {
     
    public int upper_bound_ (int n, int v, int[] a) {
        int i=0;
        int j=n-1;
        int index=n+1;
       
       if (v > a[n - 1]) return n + 1;     //如果最大值小于查找值则直接返回
        
        
//         [2,3,4]  1
//         [2,3,4,4,5] 4 
        while(i<j){
           int mid=(i+j)/2; 
           if(a[mid]>=v){
            j=mid;   
           } 
           else{
               i=mid+1;
           }   
        } 
         return  i+1;
    } 
}

NC105 转动过得有序数组中寻找目标值

在这里插入图片描述

import java.util.*;


public class Solution {
    /**
     * 
     * @param A int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] A, int target) {
        // write code hereint
        int len = A.length;
        int left = 0;
        int right = len-1;

        while(left <= right)
        {
           int middle = (right+left)>>1;
           if(A[middle] == target)
                return middle;
           if(A[left] <= A[middle])  /// left side is sorted
           {
               if(A[left] <= target && target < A[middle])
                   right = middle-1;//[3,5,7,8,1,2] 5
               else
                   left = middle+1;//[6,7,1,2,3,4,5] 3
           }
           else                     /// right side is sorted
           {
               if(A[middle] < target && target <= A[right])
                    left = middle+1;  //[6,7,1,2,3,4,5] 3
               else
                    right = middle-1;//[3,5,7,8,1,2] 5
           }
        }
        return -1;
    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值