• 【Leetcode】Search in Rotated Sorted Array


    题目:给定一旋转数组和一整数,判断整数是否在该数组中。旋转数组的定义就是,把数组开始部分的若干个元素移到数组最后。此题假设数组中没有重复元素。

    思路:之前写的判断情况特别复杂,然后还出错。看了网上题解,这样想就可以了:通过判断mid元素的大小,得知是mid左边的序列有序还是右边的序列有序。每次将target元素和有序的序列首尾元素比较,若在该有序序列中,则移动相应指针使得在该序列中查找;否则,target元素在另一序列中,移动相应指针。

    需要注意的是,不管你用左闭右开区间,还是闭区间,你需要维护这个特性。在使用左闭右开区间时,取尾元素时记得-1,为nums[last-1]。

    相关:剑指offer中有类似的一题,是求旋转数组的最小值。两者思路不是很一样。求最小值时,是维护两个指针P1和P2,P1始终指向第一个递增序列,P2始终指向第二个递增序列,通过mid元素与首尾元素比较,移动P1或P2指针。最终P1和P2相邻时,P2即指向最小值。等等。。

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int first=0;
            int last=nums.size();
            while(first<last)
            {
                int mid=first+(last-first)/2;
                
                if(nums[mid]==target) return mid;
                
                if(nums[first]<nums[mid])
                {//左边有序
                    if(nums[first]<=target && target<=nums[mid])
                        last=mid;
                    else
                        first=mid+1;
                }
                else
                {//右边有序
                    if(nums[mid]<=target && target<=nums[last-1])//既然是左闭右开区间,这里就应该是last-1
                        first=mid+1;
                    else
                        last=mid;
                }
            }
            return -1;
        }
    };
  • 相关阅读:
    Android编译源码过程和重点
    Ubuntu 10.04 下android 源码下载与编译
    Android2.3系统的overscroll效果
    【转】打造人脉不如打造自己
    Android生命周期
    Android Bitmap和Canvas学习笔记
    Android获取手机和系统版本等信息的代码
    Android网络连接处理学习笔记
    Android风格与主题
    Android程序反编译的方法
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4687944.html
Copyright © 2020-2023  润新知