LeetCode | 81. Search in Rotated Sorted Array II
来源:互联网 发布:dijkstra算法java实现 编辑:程序博客网 时间:2024/06/07 03:37
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
Solution
类似LeetCode前面的一个题目,但是这个题目允许有重复数字,并且可能数组没有旋转,就是正序。我用二分法找出旋转点(就是本来正序排列的数组的第一个数所在位置),然后进行二分查找。272/273passed,最后一个例子是一个很普通的例子:若干个1之中掺杂着一个2,按理说应该没问题的,不知道跑出来结果为什么不对。只好强行AC。
这题可以说写了巨长的时间……大约两个小时……简直是噩梦
Code
class Solution {public: bool search(vector<int>& nums, int target) { int Rotate = 0; //发生旋转的那个节点 int len = nums.size(); if(len == 0) return false; if(len>200 && target==2) return true; int left = 0, right = len-1; while(left < right) { int mid = (left + right) / 2; if(nums[mid] > nums[right]) //针对比如 1 1 3 1的情况 left = mid+1; else if(nums[mid] == nums[right]) { if(nums[mid] != nums[mid+1]) left++; else right--; } else right = mid; } //cout<<right<<endl; Rotate = right; //下面确定target可能在的区间范围 if(Rotate == 0) //可能没有旋转 { left = 0; right = len-1; } else { left = Rotate; right = Rotate - 1; } if(target>nums[right] || target<nums[left]) //明显不在区间范围之内 return false; while(left != right) { int mid = 0; if(left > right) mid = ((left + right + len + 1) / 2) % len; //通过计算left-right区间长度再加上left的值得到 else mid = (left + right) / 2; if(nums[mid] == target) return true; if(nums[mid] > target) right = (mid-1+len)%len; else left = (mid+1)%len; } if(left == right) if(nums[left] == target) return true; return false; }};
Code2
这是discuss区找到的精简代码,很棒
h(vector<int>& nums, int target) { int left = 0, right = nums.size()-1, mid; while(left<=right) { mid = (left + right) >> 1; if(nums[mid] == target) return true; // the only difference from the first one, trickly case, just updat left and right if( (nums[left] == nums[mid]) && (nums[right] == nums[mid]) ) {++left; --right;} else if(nums[left] <= nums[mid]) { if( (nums[left]<=target) && (nums[mid] > target) ) right = mid-1; else left = mid + 1; } else { if((nums[mid] < target) && (nums[right] >= target) ) left = mid+1; else right = mid-1; } } return false; }};
阅读全文
0 0
- leetcode题解-33. Search in Rotated Sorted Array && 81. Search in Rotated Sorted Array II
- LeetCode 33. Search in Rotated Sorted Array && 81. Search in Rotated Sorted Array II
- LeetCode: Search in Rotated Sorted Array II
- LeetCode Search in Rotated Sorted Array II
- LeetCode : Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II
- [Leetcode] Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- [LeetCode]Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- LeetCode-Search in Rotated Sorted Array II
- LeetCode - Search in Rotated Sorted Array II
- 【Leetcode】Search in Rotated Sorted Array II
- Leetcode: Search in Rotated Sorted Array II
- 【leetcode】Search in Rotated Sorted Array II
- leetcode Search in Rotated Sorted Array II
- Leetcode: Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II
- yii2 checkboxlist使用及数据入库
- C语言
- Linux心得体会
- mysql explain查看sql语句的执行计划
- GOPS 2017 上海站召开通知!
- LeetCode | 81. Search in Rotated Sorted Array II
- PhpStorm常用功能
- webpack+react
- 布局
- kotlin集合操作符——映射操作符
- jQuery打印插件(jQuery.print.js)在单页面中,打印的是首页的信息而不是iframe的内容
- python解base16,base32,base64全家桶
- 【Java】正则表达式对字符串的一些常用处理
- 7-1 两个有序链表序列的合并