<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      12 在旋轉排序數組中查找元素(Search in Rotated Sorted Array)

      1 題目

      ??在旋轉排序數組中查找元素(Search in Rotated Sorted Array)

      lintcode:題號——62,難度——medium

      2 描述

      ??給定一個有序數組,但是數組以某個元素作為支點進行了旋轉(比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2)。給定一個目標值target進行搜索,如果在數組中找到目標值返回數組中的索引位置,否則返回-1。你可以假設數組中不存在重復的元素。

      ??名詞:

      RSA:旋轉排序數組,即Rotated Sorted Array

      ??樣例1:

      輸入:數組 = [4, 5, 1, 2, 3],target = 1
      輸出:2
      解釋:

      元素1在數組中對應索引位置為2。

      ??樣例2:

      輸入:數組 = [4, 5, 1, 2, 3],target = 0
      輸出:-1
      解釋:

      元素0不在數組中,返回-1。

      3 思路

      ??因為RSA是分段有序的,要在RSA里查找某個值,之前有一題是尋找RSA中的最小值[1],可以通過找到最小值將RSA分為兩段標準的有序數組,然后再進行二分查找來得到結果,這種方式的時間復雜度是兩輪二分搜索O(log n) * 2,依舊是O(log n)。
      ??第二種思路是通過拋掉不可能存在目標元素的區間,來不斷縮小目標區間的思想,即“half half”的方式,在RSA數組(假設未旋轉前的原數組為升序)的中點切一刀,考慮RSA數組的特點,數組被最小值分為上半區間和下半區間,中點位置有兩種情況,第一,中點元素在上半區間(升序RSA的上半區間在左邊),這種情況下,如果起點元素 <= 目標元素值 <= 中點元素,則目標元素不可能在中點右邊,拋掉右邊,反之則拋掉左邊;第二,中點元素在下半區間,這種情況下,如果中點元素 <= 目標元素值 <= 結尾元素,則目標元素不可能在中點左邊,拋掉左邊,反之則拋掉右邊。而判斷中點在上半區還是下半區的方式,可以通過比較中點元素值與起點元素值或者結尾元素值的大小來得到。使用以上方式來不斷縮小目標區間,直到找到目標或者目標元素不存在。使用第二種思路來解題。

      1. 取中點;
      2. 判斷中點元素值與結尾元素值的大小,找出中點屬于上半區間還是下半區間;
      3. 上半區間:起點元素 <= 目標元素值 <= 中點元素,成立則取左,不成立取右。
      4. 下半區間:中點元素 <= 目標元素值 <= 結尾元素,成立則取右,不成立取左。
      5. 重復以上步驟,直到找到目標或者目標元素不存在。

      3.1 圖解

      輸入:數組 = [4, 5, 6, 7, 8, 9, 0, 1, 2, 3],target = 9
      輸出:5

      元素9在數組中對應索引位置為5

      graph TD A --> A1[\拋掉'4, 5, 6, 7, 8'\] A[RSA '4, 5, 6, 7, 8, 9, 0, 1, 2, 3', target = 9] -- 中間位置元素'8',大于末尾元素'3',即'8'在上半區<br/>起點'4',中點'8',target為9,不滿足'起點 <= 目標 <= 中點'<br/>取右 --> B B[縮小區間至'8, 9, 0, 1, 2, 3'] -- 中間位置元素'0',小于末尾元素'3',即'0'在下半區<br/>中點'0',結尾'3',target為9,不滿足'中點 <= 目標 <= 結尾'<br/>取左 --> C B --> B1[/拋掉'2, 3'/] C[縮小區間至'8, 9, 0, 1'] -- <若算法每次循環未進行判斷,即沒有代碼中的三個if判斷><br/>中間位置元素'9',小于末尾元素'1',即'9'在上半區<br/>起點'8',中點'9',target為9,滿足'起點 <= 目標 <= 中點'<br/>取左 --> D C --> C1[/拋掉'0, 1'/] D[縮小區間至'8, 9'] -- 頭尾元素分別與target比較 --> S C -- <若算法每次循環進行了判斷,即有代碼中的三個if判斷><br/>中間位置元素'9',target為9 --> S S(找到目標元素'9',下標為5)

      3.2 時間復雜度

      ??算法的時間復雜度為O(log n)。

      3.3 空間復雜度

      ??算法的空間復雜度為O(1)。

      4 源碼

      ??注意事項:

      1. 如果每次循環都進行目標值判斷,可以在中途找到目標元素的時候直接返回,即可得到結果,不用等待二分搜索結束;
      2. 如果每次循環不進行目標值判斷,則需要在內層的條件判斷上考慮邊界;
      3. 返回的是序號,不是元素值。

      ??C++版本:

      /**
      * @param A: RSA數組
      * @param target: 需要查找的目標值
      * @return: 目標值的索引
      */
      int search(vector<int> &A, int target) {
              // write your code here
              if (A.empty())
              {
                  return -1;
              }
      
              int start = 0;
              int end = A.size() - 1;
              int mid = 0;
              while (start + 1 < end)
              {
                  mid = start + (end - start) / 2;
                  // 這里三個if是每次循環進行判斷,為了加速搜索,如果當前已經找到目標值,直接返回,不用等到二分搜索結束
                  if (A.at(start) == target)
                  {
                      return start;
                  }
                  if (A.at(mid) == target)
                  {
                      return mid;
                  }
                  if (A.at(end) == target)
                  {
                      return end;
                  }
      
                  if (A.at(mid) > A.at(end)) // 判斷中點是否在上半區間
                  {
                      // 如果沒有上面的三個if,此處的“<”、“>”都應該考慮邊界,變為“<=”、“>=”
                      if (A.at(start) < target && A.at(mid) > target) 
                      {
                          end = mid;
                      }
                      else
                      {
                          start = mid;
                      }
                  }
                  if (A.at(mid) < A.at(end)) // 判斷中點是否在下半區間
                  {
                      // 如果沒有上面的三個if,此處的“<”、“>”都應該考慮邊界,變為“<=”、“>=”
                      if (A.at(mid) < target && A.at(end) > target)
                      {
                          start = mid;
                      }
                      else
                      {
                          end = mid;
                      }
                  }
              }
      
              if (A.at(start) == target)
              {
                  return start;
              }
              if (A.at(end) == target)
              {
                  return end;
              }
      
              return -1;
          }
      

      1. 尋找旋轉排序數組中的最小值:https://blog.csdn.net/SeeDoubleU/article/details/118447152 ??

      posted @ 2021-07-27 22:23  seedoubleu  閱讀(110)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 综合色在线| 精品国产乱码久久久久久浪潮| 青青草国产精品日韩欧美| 精品人妻伦九区久久aaa片| 亚洲精品一区二区妖精| a4yy私人毛片| 亚洲午夜av一区二区| 日本一区二区三区在线播放| 国产自拍一区二区三区在线| 国产微拍一区二区三区四区| 中文字幕av无码免费一区| 日韩精品中文字幕一线不卡| 18禁午夜宅男成年网站| 秋霞AV鲁丝片一区二区| 精品国偷自产在线视频99| 老熟妇乱子交视频一区| 制服丝袜美腿一区二区| 大地资源免费视频观看| 色欲av久久一区二区三区久| 亚洲最大成人在线播放| 成年女人免费v片| 最新国产精品好看的精品| 亚洲欧美综合中文| 国产成人久久777777| 熟妇的奶头又大又长奶水视频| 成人午夜在线观看刺激| 日本免费一区二区三区| 福利网午夜视频一区二区| 亚洲av无码成人精品区一区| 国产愉拍精品手机| 无码专区人妻系列日韩精品| 亚洲国产精品一区二区第一页| 乱色熟女综合一区二区三区| 年轻女教师hd中字3| 天天澡日日澡狠狠欧美老妇 | 另类 专区 欧美 制服| 亚洲高清国产拍精品熟女| 亚洲精品成人片在线观看精品字幕 | 欧美熟妇乱子伦XX视频| AV无码不卡一区二区三区| 国产av亚洲精品ai换脸电影|