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
  • 相关阅读:
    elasticsearch 插件 大全
    ElasticSearch 服务搭建
    限制玻尔兹曼机(Restricted Boltzmann Machine)RBM
    卷积神经网络
    [转]MATLAB cell数据类型
    [转]matlab语言中的assert断言函数
    [转]matlab中squeeze函数的用法,numel的用法
    Sparse autoencoder implementation 稀疏自编码器实现
    MATLAB中的randi函数
    可视化自编码器训练结果&稀疏自编码器符号一览表
  • 原文地址:https://www.cnblogs.com/immiao0319/p/7896650.html
Copyright © 2011-2022 走看看