zoukankan      html  css  js  c++  java
  • LeetCode Search in Rotated Sorted Array

    class Solution {
    public:
        int search(int A[], int n, int target) {
            if (n < 1) return -1;
            
            int left = -1, right = n, mid;
            int last = A[n-1];
            while (left + 1 < right) {
                mid = (right + left) / 2;
                if (A[mid] < last) {
                    right = mid;
                } else if (A[mid] > last) {
                    left = mid;
                } else {
                    right = mid; // only when n == 1
                }
            }
            
            if (last > target) {
                right = n;
            } else if (last < target){
                left = -1;
            } else {
                return n-1;
            }
            while(left + 1 < right) {
                mid = (right + left) / 2;
                if (A[mid] < target) {
                    left = mid;
                } else if (A[mid] > target) {
                    right = mid;
                } else {
                    return mid;
                }
            }
            return -1; 
        }
    };

    先用二分找出分界元素,然后根据所要搜索数值和最后一个数的大小关系确定在那一段内搜索。

    第二轮:

    对于重复数字数组可以采用稍微简单一点的方法,不用先特地求出分界:

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int len = nums.size();
            int lo = 0;
            int hi = len - 1;
            while (lo < hi) {
                int mid = (lo + hi) / 2;
                if (nums[mid] == target) {
                    return mid;
                }
                if (nums[mid] >= nums[lo]) {
                    if (nums[lo] <= target && nums[mid] >= target) {
                        hi = mid;
                    } else {
                        lo = mid + 1;
                    }
                } else {
                    if (nums[mid] <= target && nums[hi] >= target) {
                        lo = mid + 1;
                    } else {
                        hi = mid;
                    }
                }
            }
            if (lo < len && nums[lo] == target) {
                return lo;
            }
            return -1;
        }
    };

    当有重复数字是`nums[mid] >= nums[lo]`判断就会有问题了

  • 相关阅读:
    Ubuntu 12.04 gedit编辑器 中文乱码
    ubuntu设置vim语法高亮显示和自动缩进
    Linux学习小结(转)
    指向常量的指针和常量指针
    Android之EditText
    android之TextView
    Android存储机制之Preference
    android实现可拖动按钮
    用turtle画图
    torchvision里densenet代码分析
  • 原文地址:https://www.cnblogs.com/lailailai/p/3684170.html
Copyright © 2011-2022 走看看