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
  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/immiao0319/p/7896650.html
Copyright © 2011-2022 走看看