当前位置: 首页 > news >正文

兰州网站推广企业管理网站

兰州网站推广,企业管理网站,网站优化如何做,京山网站制作已知整数数组nums,先按升序排序后,再旋转。旋转k位后,元素分别为nums[k],nums[k1]...nums[0]...nums[k-1]。请查找target 是否存在,如果存在返回所在索引;否则返回-1。假定nums没有重复的元素。 假定排序后的数组为{1…

已知整数数组nums,先按升序排序后,再旋转。旋转k位后,元素分别为nums[k],nums[k+1]...nums[0]...nums[k-1]。请查找target 是否存在,如果存在返回所在索引;否则返回-1。假定nums没有重复的元素。

假定排序后的数组为{1,2,3,4,5}。

旋转0位:不变。

旋转1位:{2,3,4,5,1}

旋转2位:{3,4,5,1,2}

旋转3位:{4,5,1,2,3}

旋转4位:{5,1,2,3,4}

解题思路

观察后,可以得到如下结论:

旋转数组,可以拆分成左右两个升序数组,且左数组的任意元素都大于右数组的任意元素。

分两步:

  • 找到数组的分界线RBegin,[0,RBegin)是左数组,[RBegin,n)是右数组。特殊情况:只有一个升序数组,则RBegin为0,左数组为空。
  • 如果是小于等于nums.back(),在右边找;否则在左边找。升序寻找元素之前已经讲过了,就不累赘了。
            1. 寻找RBegin

nums[mid] < nums.back()

扔掉右边,不扔mid

nums[mid] == nums.back()

扔掉右边,不扔mid

nums[mid] > nums.back()

扔掉左边,扔掉mid

故用左开右闭空间。

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int rBegin = FindRBegin(nums);
        if (target <= nums.back())
        {
            return Find(nums, rBegin, nums.size(), target);
        }
        return Find(nums, 0, rBegin, target);
    }
    int FindRBegin(const vector<int>& nums)
    {
        int left = -1, r = nums.size()-1;//左开右闭
        while (r - left > 1)
        {
            const int mid = left + (r - left) / 2;
            if (nums[mid] <= nums.back())
            {
                r = mid;
            }
            else
            {
                left = mid;
            }
        }
        return r;
    }
    int Find(const vector<int>& nums, int left, int r, int target)
    {
        while (r - left > 1)
        {
            const auto mid = left + (r - left) / 2;
            if (nums[mid] <= target)
            {
                left = mid;
            }
            else
            {
                r = mid;
            }
        }
        return (target == nums[left]) ? left : -1;
    }
};
int main()
{
    vector<int> vNums = {1,2,3,4,6};
    auto res = Solution().search(vNums, 4);
    std::cout << "index:" <<  res;
    if (-1 != res)
    {
        std::cout << " value:" << vNums[res];
    }
}

注意

开发及测试操作系统:Windows10(安装的时候没注意,安装成了英文版)
开发及测试环境:Microsoft Visual Studio 2022  
如果还不明白,请看我的视频;如果看完视频,还是不明白,请下载源码后,直接修改。
 

http://www.yayakq.cn/news/969433/

相关文章:

  • 云南网站开发网络公司前10wordpress页面重定向
  • 网站怎么上百度wordpress快速
  • 网站设计的硬件如何写市场调研报告
  • 天津专业网站制作wordpress更改固定链接页面打不开
  • 网站开发一般用哪些语言wordpress连接数据库不成功
  • 教做3d的网站品牌建设人才队伍建设
  • 网站a记录的是做cname南京电信网站空间扩容
  • 私人定制平台网站界面设计的重要性
  • 某网站做参考文献的书写人力外包公司怎么赚钱
  • 建设实木餐桌椅移动网站网站服务器有哪些类型有哪些类型有哪些类型有哪些类型有哪些
  • 网站上传虚拟主机WordPress安装两个seo插件
  • 财佰通突然做网站维护网站群发手机短信
  • 机械东莞网站建设小说网站怎么做空间小
  • 烟台网站建设精通臻动传媒网站 功能建设上 不足
  • 中国建设银行官方网站企业龙岩网站定制
  • 广州网站优化多少钱聊城做wap网站价格
  • 氧化锌网站建设上海建筑公司黄页
  • 哪家网站游戏做的比较好的彭山网站建设
  • 合肥做网站可以吗wordpress 显示纯文字
  • 郑州十大网站建设公司wordpresscom下载
  • 网站设计怎么好看canvas做的手机网站
  • 电子商务网站建设思维导图网站建设公司保定市
  • 邯郸企业网站建设公司app开发与制作公司
  • 湖南网站建设价位网站 验证码错误
  • 海淀手机网站设计公司怎么做提卡网站
  • 主做收影视出版的小说网站seo最好的cms系统
  • 办个网站卖什么好处唐山门户网站建设
  • 快速建站费用手机如何强制下载网页视频
  • wordpress mv网站模板wordpress去除版本号
  • 杭州新网站建设方案wordpress同步到qq空间