一:Search in Sorted Array

二分查找,可有重复元素,返回target所在的位置,只需返回其中一个位置,代码中的查找范围为[low,high),左闭右开,否则容易照成死循环。

代码:

  1. class Solution {
  2. public:
  3. int search(vector<int>& nums, int target) {
  4. int numsSize = nums.size();
  5. int low = ,high = numsSize;
  6. while(low < high){
  7. int mid = low + (high-low)/;
  8. if(nums[mid]==target){
  9. return mid;
  10. }else if(nums[mid]<target){
  11. low = mid+1;
  12. }else if(nums[mid]>target){
  13. high = mid;
  14. }
  15. }
  16. return -;
  17. }
  18. };

二:Search in Rotated Sorted Array

Suppose a sorted array 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).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

数组中不存在重复元素

这时没法像通常的二分查找那样的直接定位target在中点元素的哪一端,需要进行讨论。如果target<A[mid],有两种可能,一种是mid在左边有序数组,另一种可能是mid在右侧的有序数组。mid在左边有序数组,那么target又有两种可能,可以在左边有序数组,也可在右边有序数组;如果mid在右侧有序数组,那么只有一种可能,只能在右侧数组。同理可以讨论target>A[mid]时的情况。而mid在左侧有序数组还是右侧有序数组可以通过A[mid]>A[low]?的关系确定。当然可以画图分析,红线部分表示mid可能的位置:

代码:

  1. class Solution {
  2. public:
  3. int search(vector<int>& nums, int target) {
  4. int numsSize = nums.size();
  5. int low = ,high = numsSize;
  6. while(low < high){
  7. int mid = low + (high-low)/;
  8. if(nums[mid]==target){
  9. return mid;
  10. }else if(nums[mid]<target){
  11. if(nums[mid]>nums[low]){//mid位于左边区域
  12. low = mid+;
  13. }else{//mid位于右边区域
  14. if(target>nums[low]){
  15. high = mid;
  16. }else if(target == nums[low]){
  17. return low;
  18. }else{
  19. low = mid+;
  20. }
  21. }
  22. }else if(nums[mid]>target){
  23. if(nums[mid]>nums[low]){//mid位于左边区域,target有两个可能的区域位置
  24. if(target>nums[low]){
  25. high = mid;
  26. }else if(target == nums[low]){
  27. return low;
  28. }else{
  29. low = mid+;
  30. }
  31. }else{//mid位于右边区域
  32. high = mid;
  33. }
  34. }
  35. }
  36. return -;
  37. }
  38. };

三:Search in Rotated Sorted ArrayII

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.

数组中如果有重复元素时,时间复杂度退化到o(n)。

如果有重复元素,当A[mid]>=A[low]时,我们无法确定mid在左边有序数组还是右边有序数组,可以画图理解,如下两幅图,红线部分表示mid的位置,两幅图中均有A[mid]>=A[low]

  

由于当target>A[mid]时,我们无法确定mid在哪个有序数组中,所以我们没法讨论了,此时,我们将low上升一个,high下降一个。

代码:

  1. class Solution {
  2. public:
  3. bool search(vector<int>& nums, int target) {
  4. int numsSize = nums.size();
  5. int low = ,high = numsSize;
  6. while(low < high){
  7. int mid = low + (high-low)/;
  8. if(nums[mid]==target){
  9. return true;
  10. }else if(nums[mid]<target){
  11. if(nums[mid]>=nums[low]){//无法确定mid在左边区域还是在右边区域
  12. if(target == nums[low] || target==nums[high-]){
  13. return true;
  14. }
  15. low++;
  16. high--;
  17. }else{//mid位于右边区域
  18. if(target>nums[low]){
  19. high = mid;
  20. }else if(target == nums[low]){
  21. return true;
  22. }else{
  23. low = mid+;
  24. }
  25. }
  26. }else if(nums[mid]>target){
  27. if(nums[mid]>=nums[low]){//无法确定mid在左边区域还是在右边区域
  28. if(target == nums[low] || target==nums[high-]){
  29. return true;
  30. }
  31. low++;
  32. high--;
  33. }else{//mid位于右边区域
  34. high = mid;
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40. };

Search in Sorted Array,Search in Rotated Sorted Array,Search in Rotated Sorted ArrayII的更多相关文章

  1. Why is processing a sorted array faster than an unsorted array?

    这是我在逛 Stack Overflow 时遇见的一个高分问题:Why is processing a sorted array faster than an unsorted array?,我觉得这 ...

  2. Why is processing a sorted array faster than an unsorted array(Stackoverflow)

    What is Branch Prediction? Consider a railroad junction: Image by Mecanismo, via Wikimedia Commons. ...

  3. Lowest Common Ancestor of a Binary Search Tree、Lowest Common Ancestor of a Binary Search Tree

    1.Lowest Common Ancestor of a Binary Search Tree Total Accepted: 42225 Total Submissions: 111243 Dif ...

  4. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...

  5. String方法,js中Array方法,ES5新增Array方法,以及jQuery中Array方法

    相关阅读:https://blog.csdn.net/u013185654/article/details/78498393 相关阅读:https://www.cnblogs.com/huangyin ...

  6. [ES2016] Check if an array contains an item using Array.prototype.includes

    We often want to check if an array includes a specific item. It's been common to do this with the Ar ...

  7. JavaScript,通过分析Array.prototype.push重新认识Array

    在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...

  8. numpy array转置与两个array合并

    我们知道,用 .T 或者 .transpose() 都可以将一个矩阵进行转置. 但是一维数组转置的时候有个坑,光transpose没有用,需要指定shape参数, 在array中,当维数>=2, ...

  9. [Javascript] Different ways to create an new array/object based on existing array/object

    Array: 1. slice() const newAry = ary.slice() 2. concat const newAry = [].concat(ary) 3. spread oprea ...

  10. php xml转数组,数组转xml,array转xml,xml转array

    //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...

随机推荐

  1. Javascript进阶篇——(函数)笔记整理

    这节是根据慕课网和JavaScript DOM编程艺术一书加起来做的笔记 什么是函数如果需要多次使用同一段代码,可以把它们封装成一个函数.函数(function)就是一组允许在你的代码里随时调用的语句 ...

  2. 目标管理剖析与实践– 献给追梦的人 (转)

      好久没写日志了. 最近总算在忙碌的日子中小小的松了一口气, 过来补起这几个月的空缺. 上次写的Cover Letter & Resume 重点诠释 - 深度剖析没想到居然超过了一万的阅读量 ...

  3. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  4. frame和iframe

    1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...

  5. ZendStudio10 代码格式化 xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...

  6. 【Android类型SDK测试(二)】环境基础

    (一)语言 Android使用的Java语言,所以要测试Android类型的SDK,Java的基础知识还是需要的. 另外,Android中有NDK类型的编程,需要知道C相关的知识. (二)环境准备 A ...

  7. table中td,th不能设置margin

    首先,我们需要知道的是:我们可以对表格table设置margin,而不能设置padding;对单元格td设置padding,而不能设置margin.所以说,我们不能对单元格td设置margin属性来调 ...

  8. Android PorterDuff.Mode

    1.PorterDuff.Mode.CLEAR所绘制不会提交到画布上. 2.PorterDuff.Mode.SRC显示上层绘制图片 3.PorterDuff.Mode.DST显示下层绘制图片 4.Po ...

  9. 给WebApp加一个“壳”,实现Andriod系统添加到桌面

    IOS系统的Safari浏览器有一个“添加到桌面”的功能,能在手机桌面上为你的Webapp添加一个快捷方式,其外观和Native App看起来一样. 这个功能对Webapp来说太有用了,它能让用户像“ ...

  10. ICE-3.5.1-错误记录

    windwos上QT5使用ICE中遇到的一个小bug: error: C3083: “Stm”:“::”左侧的符号必须是一种类型error: C2039: “upCast”: 不是“IceProxy” ...