解题报告:LeetCode Search in Rotated Sorted Array II(循环数字查找)
2015-12-15 18:31
453 查看
题目出处:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
题意描述:
给定一循环数组,查找目标值是否在该数组中。
解决思路:
由于这是Search in Rotated Sorted Array的后续题目,因此我想为了解决这道题我们有必要先解决上一道题。也就是不重复的情况下的查找。由于数组不重复,因此我们只需要先找出突变的位置即可调用经典的二分查找。而查找突变位置也可以通过二分的方式给出。附代码如下(其中find_mid函数为寻找突变点的函数,binary_search为普通的二分查找,search在调用find_mid获得突变点的位置后调用binary_search查找并获取结果)。
View Code
果然,上述代码跪了,对样例分析可知,在首位和中间的值均相等时,函数无法确定突变点在左半区间还是右半区间。于是我们需要对此特殊情况进行处理。我的做法是判定这三个值均相等时修改上界或下界,再递归调用函数求解。代码如下:
上述代码获得了AC。OK,吃饭去了。
题意描述:
给定一循环数组,查找目标值是否在该数组中。
解决思路:
由于这是Search in Rotated Sorted Array的后续题目,因此我想为了解决这道题我们有必要先解决上一道题。也就是不重复的情况下的查找。由于数组不重复,因此我们只需要先找出突变的位置即可调用经典的二分查找。而查找突变位置也可以通过二分的方式给出。附代码如下(其中find_mid函数为寻找突变点的函数,binary_search为普通的二分查找,search在调用find_mid获得突变点的位置后调用binary_search查找并获取结果)。
class Solution { public: int find_mid(vector<int>& nums, int l, int r) { if(l == r) return r; int pos = (r+l)/2; if(nums[pos] >= nums[0] && nums[pos+1] < nums[0]) return pos; else if(nums[pos] < nums[0]) return find_mid(nums, l, pos-1); else return find_mid(nums, pos+1, r); }; int binary_search(vector<int>& nums, int target, int l, int r) { if(l > r) return -1; int mid = (l+r)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target) return binary_search(nums, target, mid+1, r); else return binary_search(nums, target, l, mid-1); } bool search(vector<int>& nums, int target) { int mid = find_mid(nums, 0, nums.size()-1); int pos; if(nums[0] > target) { if(mid < nums.size()-1) pos = binary_search(nums, target, mid+1, nums.size()-1); else pos = -1; } else pos = binary_search(nums, target, 0, mid); return (pos != -1); }; };
View Code
果然,上述代码跪了,对样例分析可知,在首位和中间的值均相等时,函数无法确定突变点在左半区间还是右半区间。于是我们需要对此特殊情况进行处理。我的做法是判定这三个值均相等时修改上界或下界,再递归调用函数求解。代码如下:
class Solution { public: int find_mid(vector<int>& nums, int l, int r) { if(l == r) return r; int pos = (r+l)/2; if(nums[pos] >= nums[0] && nums[pos+1] < nums[0]) return pos; else if(nums[pos] < nums[0]) return find_mid(nums, l, pos-1); else if(nums[pos] > nums[0]) return find_mid(nums, pos+1, r); else { if(nums[r] == nums[pos]) r --; else l ++; return find_mid(nums, l, r); } }; int binary_search(vector<int>& nums, int target, int l, int r) { if(l > r) return -1; int mid = (l+r)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target) return binary_search(nums, target, mid+1, r); else return binary_search(nums, target, l, mid-1); } bool search(vector<int>& nums, int target) { int mid = find_mid(nums, 0, nums.size()-1); int pos; if(nums[0] > target) { if(mid < nums.size()-1) pos = binary_search(nums, target, mid+1, nums.size()-1); else pos = -1; } else pos = binary_search(nums, target, 0, mid); return (pos != -1); }; };
上述代码获得了AC。OK,吃饭去了。
相关文章推荐
- NSPredicate 使用方法
- hdu 1010 temp of the bone 【搜索+奇偶剪枝】
- 日均百万 PV 的站点如何做性能监测?试试「3M口罩」!
- Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)
- 无法打开"cv.h"问题解答
- HDOJ--2012
- js encodeURI() decodeURI() encodeURIComponent() decodeURIComponent()
- js encodeURI() decodeURI() encodeURIComponent() decodeURIComponent()
- openwrt启动过程(脚本)
- iOS 绘画(二)
- Nazo小游戏(1-10关)
- zabbix-Agent端安装
- spring整合消息队列rabbitmq
- iOS 绘画(一)
- 如何恢复被覆盖的文件
- Shiro 学习笔记(1)-Helloworld 和 身份认证
- CSDN上Android与IPhone开发博客精选
- 7-3 UVA 10976 Fractions Again?!分数拆分
- hadoop2.0 HA高可用笔记和搭建流程
- SSO-淘宝网and京东(前台分析)