Search in Rotated Sorted Array II
来源:互联网 发布:生成对抗网络 编辑:程序博客网 时间:2024/05/23 21:06
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
这道题目尽管用了 binary search,但 time complexity 依然是 n, 但是还是用binary search 实现了一下:
修改过的代码,比 “search in rotated sorted array” 只多了两个while 循环,但是也是反复修改才添加正确的,面试的时候不一定能一次写正取。
</pre><pre name="code" class="java">public class Solution { public boolean search(int[] A, int target) { if (A == null || A.length == 0) { return false; } int start = 0; int end = A.length - 1; int mid; boolean inLeft; while (start + 1 < end) { mid = start + (end - start) / 2; if (target == A[mid]) { return true; } else { /** * 当while 循环被执行时,说明至少有一边的数据是完全相等的,例如 1121111,或者211111 * 对于112111,执行完两个while循环以后,start 和 end 都指向 2 * 则跳出最外层while循环 * * 对于211111这种,执行以后end == mid,继续操作 * 所以两个while循环主要用来处理这种情况 * 处理完以后,就可以按照 “search in rotated sorted array ” 的方法来写 */ while (start< A.length-1 && A[mid] == A[start]) { start ++; } while (end > 0 && A[mid] == A[end]) { end--; } if (target < A[mid]) { if (A[mid] > A[end] && A[end] >= target) { start = mid + 1; } else { end = mid - 1; } } else { if (A[mid] < A[start] && target >= A[start]) { end = mid - 1; } else { start = mid + 1; } } } } if (target == A[start] || target == A[end]) { return true; } return false; }}
第一次写的答案:
public class Solution { public boolean search(int[] A, int target) { if (A == null || A.length == 0) { return false; } int start = 0; int end = A.length - 1; int mid; boolean inLeft; while (start + 1 < end) { mid = start + (end - start) / 2; if (target == A[mid]) { return true; } else { if (A[mid] == A[start] && A[mid] == A[end]) { int i; for (i = mid - 1; i >= 0; i--) { if (A[i] != A[mid]) { end = i ; break; } } if (end != i) { start = mid + 1; } } else if (A[mid] == A[start] && A[mid] != A[end]){ start = mid + 1; }else if (A[mid] != A[start] && A[mid] == A[end]){ end = mid - 1; } else { if (target < A[mid]) { if (A[mid] > A[end] && A[end] >= target) { start = mid + 1; } else { end = mid - 1; } } else { if (A[mid] < A[start] && target >= A[start]) { end = mid - 1; } else { start = mid + 1; } } } } } if (target == A[start] || target == A[end]) { return true; } return false; }}
别人的答案(我自己觉得第一份代码 比这份答案看上去还要清晰一点)
public class Solution { public boolean search(int[] A, int target) { int start = 0, end = A.length-1; while(end - start >= 2) { int middle = start + (end-start)/2; if(A[middle] == target) return true; if(A[start] < A[middle]) { if(A[start] <= target && target < A[middle]) end = middle-1; else start = middle+1; } if(A[middle] < A[end]) { if(A[middle] < target && target <= A[end]) start = middle+1; else end = middle-1; } if(A[start] == A[middle]) start++; if(A[middle] == A[end]) end--; } for(int i = start; i <= end; i++) { if(A[i] == target) return true; } return false; }}
0 0
- LeetCode: Search in Rotated Sorted Array II
- 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
- Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- [LeetCode]Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- LeetCode-Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II
- LeetCode - Search in Rotated Sorted Array II
- 【Leetcode】Search in Rotated Sorted Array II
- 常见gstreamer pipeline 命令
- 醒涨部琳刚释赏芬锤叛饰优逞廖糖
- IntelliJ IDEA 调试java程序
- 犹收执着拖儋断杭堆刂截背欠砸拖
- CheckBox 屏蔽空格按键
- Search in Rotated Sorted Array II
- 惊呆页的么做注射今天弊
- 如果时间言文器活的游膛
- crontab的简单使用__watch超越crontab精度达到秒级的定时调度器
- METINFO 去版权
- nginx中配置proxy_cache使用内存的方法
- 八皇后问题
- 27款后台管理页面设计 DIV+CSS+JS
- 无处不在的Android,开发者的春天,话说现在是夏天啊