zoukankan      html  css  js  c++  java
  • Leetcode题解(十二)

    33、Search in Rotated Sorted Array

    题目

    这道题目如果没有其他要求,直接遍历一遍就可以知道答案,但是,题目给出了是排序了数组,但是数组有可能经过了旋转得到,其解题思路仍然是二分查找,只不过在处理的时候需要添加一下逻辑处理;

     在做逻辑判断的时候,主要判断的是target可能位于middle的坐标还是右边,这样才能确定应该执行first = middle+1还是second = middle - 1;

    旋转后的数组可以分为两部分,前一部分是数组递增部分,如[4,5,6,7],后一部分是[0,1,2]

    代码如下:

     1 class Solution {
     2 public:
     3     int search(vector<int>& nums, int target) {
     4         int first,second,middle;
     5         first = 0;
     6         second = nums.size() - 1;
     7 
     8         while (first <= second)
     9         {
    10             middle = (first + second)/2;
    11             if(target == nums[middle])
    12                 return middle;
    13             if(nums[middle] >= nums[first] && nums[middle] >= nums[second])//middle位于前一部分并且first在前一部分,second在后一部分
    14             {
    15                 if(target >= nums[first] && target > nums[middle])//middle可能位于前一部分,并且位于middle右边,所以first=middle+1
    16                     first = middle+1;
    17                 else if(target >= nums[first] && target < nums[middle])//middle可能位于前一部分,并且位于middle的左边
    18                     second = middle-1;
    19                 else 
    20                     first = middle+1;
    21             }
    22             else if(nums[middle] <= nums[first] && nums[middle] <= nums[second])//middle位于后一部分,并且first位于前一部分,second位于后一部分
    23             {
    24                 if(target <= nums[second] && target < nums[middle])
    25                     second = middle-1;
    26                 else if(target <= nums[second] && target > nums[middle])
    27                     first = middle+1;
    28                 else
    29                     second = middle-1;
    30             }
    31             else //first和second位于同一部分,就退化为普通的二分查找了
    32             {
    33                 if(target > nums[middle])
    34                     first = middle+1;
    35                 else
    36                     second = middle-1;
    37             }
    38         }
    39 
    40         return -1;
    41 
    42 
    43     }
    44 };

     --------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------

    34、Search for a Range

    题目

    这道题目是二分法的具体应用,直接上代码;

     1 class Solution {
     2 public:
     3     vector<int> searchRange(vector<int>& nums, int target) {
     4         int first,second,middle;
     5         const int size = nums.size();
     6         vector<int> res;
     7 
     8         first = 0;
     9         second = size - 1;
    10 
    11         while(first <= second)
    12         {
    13             middle = (first + second)/2;
    14             if(target == nums[middle])
    15                 break;
    16             else
    17             {
    18                 if(target > nums[middle])
    19                     first = middle+1;
    20                 else
    21                     second = middle-1;
    22             }
    23         }
    24         int t;
    25         if(first <= second)
    26         {
    27             t = middle;
    28             while(target == nums[t]&&t>=0)
    29                 t--;
    30             t++;
    31             res.push_back(t);
    32             t=middle;
    33             while(target == nums[t]&&t<size)
    34                 t++;
    35             t--;
    36             res.push_back(t);
    37 
    38         }
    39         else
    40         {
    41             res.push_back(-1);
    42             res.push_back(-1);
    43         }
    44         return res;
    45     }
    46 };

     -----------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------

    35、Search Insert Position

    题目

    二分查找的应用,直接代码:

     1 class Solution {
     2 public:
     3     int searchInsert(vector<int>& nums, int target) {
     4         const int size = nums.size();
     5         if(0 == size)
     6             return 0;
     7 
     8         int first,second,middle;
     9         first = 0;
    10         second = size - 1;
    11 
    12         while(first < second)//注意没有用<=
    13         {
    14             middle = (first + second)/2;
    15             if (target == nums[middle]) 
    16             {
    17                 return middle;
    18             }
    19             else if (target > nums[middle])
    20             {
    21                 first = middle+1;
    22             }
    23             else
    24                 second = middle-1;
    25         }
    26 
    27         if(target > nums[first])
    28             return first+1;
    29         else
    30             return first;
    31 
    32     }
    33 };
  • 相关阅读:
    线性表顺序表模板 纯本人手工创造
    娘的,自己的求逆序对模板又不好使了。。。。。。。。
    杜教筛学习总结
    2019 年百度之星·程序设计大赛
    2019中国大学生程序设计竞赛(CCPC)
    2019 年百度之星·程序设计大赛
    2019 Multi-University Training Contest 7
    2019 Multi-University Training Contest 9
    2019牛客暑期多校训练营(第十场)
    2019 Multi-University Training Contest 8
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/5046538.html
Copyright © 2011-2022 走看看