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

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

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

      劍指Offer面試題:7.旋轉(zhuǎn)數(shù)組的最小數(shù)字

      一、題目:旋轉(zhuǎn)數(shù)組的最小數(shù)字

      題目:把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。輸入一個遞增排序的數(shù)組的一個旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉(zhuǎn),該數(shù)組的最小值為1。

        這道題最直觀的解法并不難,從頭到尾遍歷數(shù)組一次,我們就能找出最小的元素。這種思路的時間復雜度顯然是O(n)。但是這個思路沒有利用輸入的旋轉(zhuǎn)數(shù)組的特性,肯定達不到面試官的要求。

        我們注意到旋轉(zhuǎn)之后的數(shù)組實際上可以劃分為兩個排序的子數(shù)組,而且前面的子數(shù)組的元素都大于或者等于后面子數(shù)組的元素。我們還注意到最小的元素剛好是這兩個子數(shù)組的分界線。在排序的數(shù)組中我們可以用二分查找法實現(xiàn)O(logn)的查找。

      二、解題思路

        Step1.和二分查找法一樣,我們用兩個指針分別指向數(shù)組的第一個元素和最后一個元素。

        Step2.接著我們可以找到數(shù)組中間的元素:

        如果該中間元素位于前面的遞增子數(shù)組,那么它應該大于或者等于第一個指針指向的元素。此時數(shù)組中最小的元素應該位于該中間元素的后面。我們可以把第一個指針指向該中間元素,這樣可以縮小尋找的范圍。移動之后的第一個指針仍然位于前面的遞增子數(shù)組之中。如果中間元素位于后面的遞增子數(shù)組,那么它應該小于或者等于第二個指針指向的元素。此時該數(shù)組中最小的元素應該位于該中間元素的前面。

        Step3.接下來我們再用更新之后的兩個指針,重復做新一輪的查找。

      按照上述的思路,第一個指針總是指向前面遞增數(shù)組的元素,而第二個指針總是指向后面遞增數(shù)組的元素。最終第一個指針將指向前面子數(shù)組的最后一個元素,而第二個指針會指向后面子數(shù)組的第一個元素。也就是它們最終會指向兩個相鄰的元素,而第二個指針指向的剛好是最小的元素。這就是循環(huán)結(jié)束的條件。

        以前面的數(shù)組{3,4,5,1,2}為例,下圖展示了在該數(shù)組中查找最小值的過程:

      三、解決問題

      3.1 代碼實現(xiàn)

          public static int GetMin(int[] numbers)
          {
              if (numbers == null || numbers.Length <= 0)
              {
                  return int.MinValue;
              }
      
              int index1 = 0;
              int index2 = numbers.Length - 1;
              // 把indexMid初始化為index1的原因:
              // 一旦發(fā)現(xiàn)數(shù)組中第一個數(shù)字小于最后一個數(shù)字,表明該數(shù)組是排序的
              // 就可以直接返回第一個數(shù)字了
              int indexMid = index1;
      
              while (numbers[index1] >= numbers[index2])
              {
                  // 如果index1和index2指向相鄰的兩個數(shù),
                  // 則index1指向第一個遞增子數(shù)組的最后一個數(shù)字,
                  // index2指向第二個子數(shù)組的第一個數(shù)字,也就是數(shù)組中的最小數(shù)字
                  if (index2 - index1 == 1)
                  {
                      indexMid = index2;
                      break;
                  }
                  indexMid = (index1 + index2) / 2;
                  // 特殊情況:如果下標為index1、index2和indexMid指向的三個數(shù)字相等,則只能順序查找
                  if (numbers[index1] == numbers[indexMid] && numbers[indexMid] == numbers[index2])
                  {
                      return GetMinInOrder(numbers, index1, index2);
                  }
                  // 縮小查找范圍
                  if (numbers[indexMid] >= numbers[index1])
                  {
                      index1 = indexMid;
                  }
                  else if (numbers[indexMid] <= numbers[index2])
                  {
                      index2 = indexMid;
                  }
              }
      
              return numbers[indexMid];
          }
      
          public static int GetMinInOrder(int[] numbers, int index1, int index2)
          {
              int result = numbers[index1];
              for (int i = index1 + 1; i <= index2; ++i)
              {
                  if (result > numbers[i])
                  {
                      result = numbers[i];
                  }
              }
      
              return result;
          }

        這里需要注意的是:

       ?。?)把indexMid初始化為index1的原因:一旦發(fā)現(xiàn)數(shù)組中第一個數(shù)字小于最后一個數(shù)字,表明該數(shù)組是排序的,就可以直接返回第一個數(shù)字了。

        (2)特殊情況的分析:如果下標為index1、index2和indexMid指向的三個數(shù)字相等,則只能順序查找,因此這里定義了一個GetMinInOrder()方法。

      3.2 單元測試

       ?。?)典型輸入,單調(diào)升序的數(shù)組的一個旋轉(zhuǎn)

          // 典型輸入,單調(diào)升序的數(shù)組的一個旋轉(zhuǎn)
          [TestMethod]
          public void GetMinNumTest1()
          {
              int[] array = {3, 4, 5, 1, 2};
              Assert.AreEqual(Program.GetMin(array),1);
          }

       ?。?)有重復數(shù)字,并且重復的數(shù)字剛好的最小的數(shù)字

          // 有重復數(shù)字,并且重復的數(shù)字剛好的最小的數(shù)字
          [TestMethod]
          public void GetMinNumTest2()
          {
              int[] array = { 3, 4, 5, 1, 1, 2 };
              Assert.AreEqual(Program.GetMin(array), 1);
          }

       ?。?)有重復數(shù)字,但重復的數(shù)字不是第一個數(shù)字和最后一個數(shù)字

          // 有重復數(shù)字,但重復的數(shù)字不是第一個數(shù)字和最后一個數(shù)字
          [TestMethod]
          public void GetMinNumTest3()
          {
              int[] array = { 3, 4, 5, 1, 2, 2 };
              Assert.AreEqual(Program.GetMin(array), 1);
          }

       ?。?)有重復的數(shù)字,并且重復的數(shù)字剛好是第一個數(shù)字和最后一個數(shù)字

          // 有重復的數(shù)字,并且重復的數(shù)字剛好是第一個數(shù)字和最后一個數(shù)字
          [TestMethod]
          public void GetMinNumTest4()
          {
              int[] array = { 1, 0, 1, 1, 1 };
              Assert.AreEqual(Program.GetMin(array), 0);
          }

       ?。?)單調(diào)升序數(shù)組,旋轉(zhuǎn)0個元素,也就是單調(diào)升序數(shù)組本身

          // 單調(diào)升序數(shù)組,旋轉(zhuǎn)0個元素,也就是單調(diào)升序數(shù)組本身
          [TestMethod]
          public void GetMinNumTest5()
          {
              int[] array = { 1, 2, 3, 4, 5 };
              Assert.AreEqual(Program.GetMin(array), 1);
          }

       ?。?)數(shù)組中只有一個數(shù)字

          // 數(shù)組中只有一個數(shù)字
          [TestMethod]
          public void GetMinNumTest6()
          {
              int[] array = { 2 };
              Assert.AreEqual(Program.GetMin(array), 2);
          }

       ?。?)魯棒性測試:輸入NULL

          // 魯棒性測試:輸入NULL
          [TestMethod]
          public void GetMinNumTest7()
          {
              Assert.AreEqual(Program.GetMin(null), int.MinValue);
          }

        單元測試的結(jié)果如下圖所示:

        對于GetMin方法編寫的單元測試的代碼覆蓋率已達到了100%:

       

      posted @ 2015-08-21 00:18  EdisonZhou  閱讀(12643)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产私拍大尺度在线视频| 一区二区三区午夜福利院| 精品国产一区二区三区久| 国内精品无码一区二区三区| 3d无码纯肉动漫在线观看| 色综合久久中文综合久久激情| 亚洲av成人无码精品电影在线| 亚洲av日韩av一区久久| 亚洲国产精品毛片av不卡在线| 日韩熟女乱综合一区二区| 国产精品乱码人妻一区二区三区| 亚洲人成人网站色www| 好吊视频在线一区二区三区| 国产精品成人一区二区三区| 国产精品无码a∨麻豆| 一个人免费观看WWW在线视频| 久久天天躁夜夜躁狠狠| 中文字幕国产精品日韩| 久久精品一区二区东京热| 国产乱码1卡二卡3卡四卡5| 延安市| 竹菊影视欧美日韩一区二区三区四区五区 | 成人无号精品一区二区三区| 夜夜夜高潮夜夜爽夜夜爰爰| 涩涩爱狼人亚洲一区在线| 久久精品日日躁夜夜躁| 囯产精品久久久久久久久久妞妞 | 亚洲av男人电影天堂热app| 国产欧美一区二区精品仙草咪| 亚洲综合一区二区精品导航| 巨爆乳中文字幕爆乳区| 2021国产精品一卡2卡三卡4卡| 久久99久久99精品免观看| 亚洲精品国产av成人网| 国产乱人偷精品人妻a片| 一区二区三区午夜无码视频| 四虎永久精品在线视频| 成人免费毛片aaaaaa片| 国精品无码一区二区三区左线| 亚洲色欲色欱WWW在线| 欧美视频二区欧美影视|