博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Search in Rotated Sorted Array I&II
阅读量:2784 次
发布时间:2019-05-13

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

找旋转数组中的target

 

解法一:

 

  1. 如果当前mid就是target,那么返回
  2. 如果左边有序(nums[mid] > nums[beg]))那么就跳到3,否则是右边有序(nums[mid] < nums[beg]),就跳到四******都是用mid和beg比较!!!
  3. 检查target是否在beg~mid之间,如果是end = mid - 1;否则beg = mid + 1
  4. 检查target是否在mid~end之间,如果是beg = mid + 1;否则end = mid - 1

 

 

public class Solution {    public int search(int[] nums, int target) {        if (nums == null || nums.length == 0) {            return -1;        }        int beg = 0;        int end = nums.length - 1;        while (beg < end) {            int mid = beg + (end - beg) / 2;            if (nums[mid] == target) {                return mid;            } else if (nums[mid] >= nums[beg]) {                if (nums[mid] > target && target >= nums[beg]) {                    end = mid - 1;                } else {                    beg = mid + 1;                }            } else {                if (nums[mid] < target && nums[end] >= target) {                    beg = mid + 1;                } else {                    end = mid - 1;                }            }        }        return nums[beg] == target ? beg : -1;    }}

 

 

 

 

 

 

解法二:

找到最小值位置,然后二分查找target的时候,将mid重映射到未旋转前数组的位置

其中找最小值先找到旋转前前半个递增的子数组,所以是无脑 nums[mid] > nums[end] -- beg = mid + 1;

 

public class Solution {    public int search(int[] nums, int target) {        if (nums == null || nums.length == 0) {            return -1;        }        int beg = 0;        int end = nums.length - 1;        while (beg < end) {            int mid = beg + (end - beg) / 2;            if (nums[mid] > nums[end]) {                beg = mid + 1;            } else {                end = mid;            }        }        int rot = beg;        beg = 0;        end = nums.length - 1;        while (beg <= end) {            int mid = beg + (end - beg) / 2;            int realMid = (mid + rot) % nums.length;            if (nums[realMid] == target) {                return realMid;            } else if (nums[realMid] > target) {                end = mid - 1;            } else {                beg = mid + 1;            }        }        return -1;    }}

 

 

 

 

假如数组中存在重复数字呢?

 

public class Solution {    public boolean search(int[] nums, int target) {        if (nums == null || nums.length == 0) {            return false;        }        int beg = 0;        int end = nums.length - 1;        while (beg < end) {            int mid = beg + (end - beg) / 2;            if (nums[mid] == target) {                return true;            }            if (nums[mid] > nums[beg]) {                if (nums[mid] > target && target >= nums[beg]) {                    end = mid - 1;                } else {                    beg = mid + 1;                }            } else if (nums[mid] < nums[beg]) {                if (nums[mid] < target && nums[end] >= target) {                    beg = mid + 1;                } else {                    end = mid - 1;                }            } else {                beg++;            }        }        return nums[beg] == target;    }}

 

 

 

 

 

 

转载地址:http://svhld.baihongyu.com/

你可能感兴趣的文章
AliOS Things 网络适配框架 - SAL
查看>>
likely()与unlikely()函数的作用
查看>>
linux I/0复用函数之 ------ poll()
查看>>
软件低功耗设计的一点小结
查看>>
mysql8.0版本在配置文件my.ini[mysqld]加上skip-grant-tables后无法启动
查看>>
bootstrap radio动态选中
查看>>
bootstrap 3.3.7 bug tooltip关闭时报Uncaught TypeError: Cannot read property 'off' of null
查看>>
使用spring boot 2.1.6生成的maven项目导入eclipse后报错pom.xml第一行报unknown error
查看>>
IntelliJ IDEA入门(二)配置文件目录更改
查看>>
IntelliJ IDEA入门(一)无法新建JavaClass和Package解决办法
查看>>
IDEA中快速添加main和System方法
查看>>
Vue.JS 开发常见问题集锦
查看>>
如何解决JavaScript中0.1+0.2不等于0.3
查看>>
vue组件传值之(父子)
查看>>
深入浅析js原型链和vue构造函数
查看>>
vue 配置多页面应用的示例代码
查看>>
基于Vue实现图片在指定区域内移动的思路详解
查看>>
vue中各种通信传值方式总结
查看>>
vuex实现及简略解析(小结)
查看>>
useradd 无法打开 /etc/passwd
查看>>