博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分查找系列
阅读量:7034 次
发布时间:2019-06-28

本文共 3493 字,大约阅读时间需要 11 分钟。

本文总结了一些二分查找的变形,其中大部分来自 leetcode 

1. (leetcode 33) Search in Rotated Sorted Array

   (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

public int search(int[] nums, int key) {        int lo = 0,hi = nums.length - 1;        while(lo <= hi){            int mid = lo + (hi - lo)/2;            if(nums[mid] == key) return mid;            if(nums[mid] < nums[hi]){
//右半部分有序 if(nums[mid] < key && key <= nums[hi]){ lo = mid + 1; //key 落在有序部分 }else{ //否则 key 落在无序部分 hi = mid -1; } }else{ //左半部分有序 if(nums[lo] <= key && key < nums[mid]){ hi = mid -1; //key 落在有序部分 }else{ //否则 key 落在无序部分 lo = mid + 1; } } } return -1; }
View Code

2. (leetcode 81) Search in Rotated Sorted Array II

    (i.e. 1 2 4 4 4 4 4 might become 4 4 4 1 2 4 4 ).

//关于最后 nums[mid] == nums [hi] 的情况            //1 2 1 1 1            //l   m   h -> hi--;            //1 2 1 1 1            //l m   h      public boolean search(int[] nums, int target) {        if(null == nums || nums.length < 0) return false;        int lo = 0,hi = nums.length - 1;        while(lo <= hi){            int mid = lo + (hi - lo)/2;            // get it            if(nums[mid] == target)  return true;            //找到有序的部分进行查找            if(nums[mid] < nums[hi]){
// 后半部分有序 if(nums[mid] < target && target <= nums[hi]){ lo = mid + 1; }else{ hi = mid - 1; } }else if(nums[mid] > nums[hi]){
// 前半部分有序 if(nums[lo] <= target && target < nums[mid]){ hi = mid - 1; } else{ lo = mid + 1; } }else{ //nums[mid] == nums[hi] hi -- ; } } return false; }
View Code

3.  Find Minimum in Rotated Sorted Array

  旋转的数组中,找到最小的数

  若 nums[mid] > nums[hi] min 落在 [mid+1, hi]

  若 nums[mid] < nums[hi] min 落在 [0, mid] 上

public int findMin(int[] nums) {        int lo = 0,hi = nums.length - 1;        while( lo < hi){            int mid = lo + (hi - lo)/2 ;            //mid > hi,min in [mid+1,hi]            if(nums[mid] > nums[hi]){                lo = mid + 1;            }            //mid < hi, min in [0,mid]             if(nums[mid] < nums[hi]){                hi = mid;            }        }        return nums[lo];    }
View Code

4. Find Minimum in Rotated Sorted Array II

  跟上次的题目一样,只不过带重复的,与题目 1 -> 2 的思路完全一样

  若 nums[mid] > nums[hi] min 落在 [mid+1, hi]

  若 nums[mid] < nums[hi] min 落在 [0, mid] 上

  若 nums[mid] == nums[hi]  则 hi--之后做进一步判断

public int findMin(int[] nums) {        int lo = 0, hi = nums.length -1;        while(lo < hi){            int mid = lo + (hi - lo)/2;            if(nums[mid] > nums[hi]){                lo = mid + 1;            }else if(nums[mid] < nums[hi]){                hi = mid;            }else{                hi--;            }        }        return nums[lo];    }
View Code

 5. Find Peak Element (leetcode)

public int Peak(int nums[])    {        int lo = 0, hi = nums.length - 1;        while(lo < hi)        {            int m1 = lo + (hi - lo) / 2;            int m2 = m1 + 1;            if(nums[m1] < nums[m2]){                lo = m2;            }else{                hi = m1;            }        }        return nums[lo];    }
View Code

 

转载于:https://www.cnblogs.com/ooon/p/5728248.html

你可能感兴趣的文章
20145103 《Java程序设计》第3周学习总结
查看>>
ubuntu声音系统
查看>>
哈哈更新资源列表2
查看>>
冲刺第一周第五天
查看>>
Java 接口
查看>>
Android 微信第三方登录
查看>>
硬盘的读写原理
查看>>
实例 centos自动挂载、备份windows共享文件夹,并删除第7日前当天的备份
查看>>
LNMP下动静分离部署phpmyadmin软件包
查看>>
如何写更好的自动化测试用例
查看>>
60再谈指针
查看>>
repost
查看>>
android异步加载AsyncTask
查看>>
GCC Stack-Smashing Protector
查看>>
虚拟机Visualbox安装Ubuntu Server
查看>>
用带余除法可以解决一切部分分式的题目
查看>>
vs 生成事件
查看>>
jmeter 实战项目总结2——微信端
查看>>
php.ini 中文版
查看>>
即时通信客户端流程,
查看>>