zoukankan      html  css  js  c++  java
  • 33. Search in Rotated Sorted Array旋转数组二分法查询

    一句话思路:反正只是寻找一个最小区间,断开也能二分。根据m第一次的落点,来分情况讨论。

    一刷报错:

    1. 结构上有根本性错误:应该是while里面包括if,不然会把代码重复写两遍,不好。
     //situation1
            if (nums[mid] > nums[start]) {
                while (start + 1 < mid) {
                    mid = start + (end - start) / 2;
                    if (nums[mid] == target) {
                        return mid;
                    }
                    else if (nums[start] <= target && target <= nums[mid]) {
                        end = mid;
                    }
                    else start = mid;
                }
            }
            
            //situantion2
            else {
                while (start + 1 < mid) {
                    mid = start + (end - start) / 2;
                    if (nums[mid] == target) {
                        return mid;
                    }
                    if (nums[mid] <= target && target <= nums[end]) {
                        start = mid;
                    }
                    else end = mid;
                }
            }
    1. int方法的corner case返回值:数组为空,数组长度为0
    2. 居然没有写target== nums[mid]的特殊情况,该死!

    一句话总结思路:要把while放在外面,if放在里面。

    二刷ac

    public class Solution {
        /*
         * @param nums: an integer rotated sorted array
         * @param target: an integer to be searched
         * @return: an integer
         */
        public int search(int[] nums, int target) {
            // write your code here
            if (nums.length == 0 || nums == null) {
                return -1;
            }
            
            int start = 0;
            int end = nums.length - 1;
            int mid;
            
            while (start + 1 < end) {
                mid = start + (end - start) / 2;
                //situation1,red line
                if (nums[mid] > nums[start]) {
                    if (nums[mid] == target) {
                        end = mid;
                    }
                    else if (nums[start] <= target && target <= nums[mid]) {
                        end = mid;
                    }
                    else start = mid;
                }
                //situation2,green line
                else {
                     if (nums[mid] == target) {
                        end = mid;
                    }
                    if (nums[mid] <= target && target <= nums[end]) {
                        start = mid;
                    }
                    else end = mid;
                }
            }
            
            if (nums[start] == target) {
                return start;
            }
            if (nums[end] == target) {
                return end;
            }
    
            return -1;
        }
    }
    View Code
  • 相关阅读:
    python enhanced generator - coroutine
    python yield generator 详解
    gunicorn syncworker 源码解析
    gunicorn 信号处理(SIGHUP,SIGUSR2)
    gunicorn Arbiter 源码解析
    gunicorn 简介
    kafka+zookeeper环境配置(linux环境单机版)
    在Linux中安装JDK的步骤
    Kafka安装及部署
    Zookeeper 安装和配置
  • 原文地址:https://www.cnblogs.com/immiao0319/p/7896650.html
Copyright © 2011-2022 走看看