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

给WordPress添加视频播放页seo站长工具下载

给WordPress添加视频播放页,seo站长工具下载,安徽泗县建设银行网站,锦州网站建设题目描述 搜索旋转排序数组 二分的过程就是归约的过程 思路来源 一个重要的性质:源数组经过旋转之后,会划分为两个递增的数组,我们假设为 a a a 和 b b b 一个清晰的思路:这道题和平常二分法查找的不同就在于,把一个有序递增的…

题目描述

搜索旋转排序数组

二分的过程就是归约的过程

思路来源
一个重要的性质:源数组经过旋转之后,会划分为两个递增的数组,我们假设为 a a a b b b
一个清晰的思路:这道题和平常二分法查找的不同就在于,把一个有序递增的数组分成了,两个递增的数组,我们需要做的就是判断这个数在哪一个递增的数组中,然后再去用常规的二分法去解决。
一个假设:我们一般性的假设源数组被旋转为: [ b 1 , b 2 , . . b m , a 1 , a 2 , a 3 , . . . , a n ] [b1, b2, ..bm, a1, a2, a3 ,..., an] [b1,b2,..bm,a1,a2,a3,...,an]

如果我们从归约的角度去考虑二分问题,那么二分的过程就是不断归约的过程,而归约又与二叉树联系很密切。如果你仔细回想一下二分的过程,它不就是从一个起点和终点为 [ l , r ] [l,r] [l,r] 的数组逐渐划分,最终变成一个起点和终点相等的单个元素的过程吗。如果我们把初始时的 [ l , r ] [l,r] [l,r] 看作跟节点,那么叶子节点就是数组中的各个元素。这其实有点像线段数了。
总之,我想说的是,二分就是一个归约的过程(每次要么归约到 m i d mid mid 的左半部分,要么归约到 m i d mid mid 的右半部分),把这个归约的过程和二叉树结合起来更容易理解。
好了,明白了归约之后,再来看这道题。

思路1:一次二分

我们依据 m i d mid mid n u m s nums nums 划分为 [ l , m i d − 1 ] [l,mid-1] [l,mid1], [ m i d , r ] [mid,r] [mid,r] 两个区间,那么接下来我们就要依据 t a r g e t target target 在那个区间来进行规约,由于 n u m s nums nums 是一个旋转数组,导致 [ l , r ] [l,r] [l,r] 未必有序,也就是这两个子区间未必都有序,但必然至少有一个是有序的。因此我们可以先找出那个区间是有序的,然后判断 t a r g e t target target是 否在这个区间,若不在则 t a r g e t target target 就在另一个区间。

reference here

class Solution {
public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;while(l < r) {int mid = l + r + 1 >> 1;// 根据mid将nums划分为两个区间:[l, mid - 1] [mid, r]// 接下来我们需要根据target在那个区间来进行归约// 由于两个区间只有一个有序,因此我们还需要先判断那个区间有序if(nums[mid] < nums[r]) { // 右区间有序if(nums[mid] <= target && target <= nums[r]) { // 在右区间l = mid;}else { // 在左区间r = mid - 1;}}else { // 左区间有序if(nums[l] <= target && target <= nums[mid - 1]) { // 在左区间r = mid - 1;}else { // 在右区间l = mid;}}}return nums[l] == target ? l : -1;}
};

思路2:两次二分

由于 n u m s nums nums 可能由两个有序区间构成,那么我们是否能找到这两个有序区间,然后分别在这两个区间上进行二分呢?答案是可行的!并且这种做法更为简单,直接!
那么怎么确定这两个有序区间呢?也很简单,直接找最值,通过最值来确定区间

class Solution {
public:int get_separate(vector<int> &nums) { // 找分隔点:e.g.最小值[l,pos(min)-1],[pos(min),r]int l = 0, r = nums.size() - 1;     // 如果找最大值就是 [l,pos(max)],[pos(max+1),r]while(l < r) {int mid = l + r >> 1;// [l, mid-1], [mid,r]if(nums[mid] < nums[r]) r = mid;else    l = mid + 1;}return l;}int binary_search(vector<int> &nums, int l, int r, int target) {while(l < r) {int mid = l + r + 1 >> 1;if(nums[mid] > target)  r = mid - 1;else    l = mid;}return nums[l] == target ? l : -1;}int search(vector<int>& nums, int target) {int s = get_separate(nums);cout << "sep: " << s << endl;// 找到两个有序区间:[0, s], [s+1, n-1]// 根据target在那个有序区间进行二分搜索if(s - 1 >= 0 && nums[0] <= target && target <= nums[s - 1])  return binary_search(nums, 0, s - 1, target);return binary_search(nums, s, nums.size() - 1, target);}
};
http://www.dtcms.com/wzjs/410082.html

相关文章:

  • 公司网站数据分析公司商洛网站建设
  • 郑州快速建站价格百度广告投放技巧
  • 唐山网站关键词优化淄博seo推广
  • 天津有哪些好的做网站公司谷歌优化排名哪家强
  • asp装修公司网站海外推广服务
  • 遵义建一个网站大概要多少钱培训课
  • 什么做网站赚钱教育培训机构网站
  • 申请网页空间的网站培训机构专业
  • 刷赞网站推广qq网站设计流程
  • 网站建设多少钱手机端搜索引擎排名
  • 儿童网站开发 论文500个游戏推广群
  • 万网的怎么做网站地图广告加盟
  • 学生做网站期末作业公司企业网站建设方案
  • 财税公司网站开发window优化大师官网
  • 大型电子商务网站开发架构合肥新闻 今天 最新消息
  • 建设银行不会自动弹出网站个人博客网站怎么做
  • 门户网站模板免费下载seo优化技术是什么
  • 长春好的做网站公司推广员是做什么的
  • php网站建设论文seo专家是什么意思
  • 东莞广告公司东莞网站建设价格沈阳seo建站
  • 如何做视频卖给网站论坛推广怎么做
  • 南京汽车集团网站建设口碑seo推广公司
  • 海珠网站建设百度竞价推广收费
  • 有哪些企业可以做招聘的网站有哪些内容站长之家网站排行榜
  • 做公众号和网站主页的区别cms自助建站系统
  • 网站推广怎么写武汉seo服务外包
  • wordpress 主题logo北京官方seo搜索引擎优化推荐
  • 怎么做自动发卡网站软文推广有哪些
  • 做dj选歌是哪个网站销售怎么做
  • 南宁市兴宁区建设局网站网站到首页排名