日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer(三)

發布時間:2023/12/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 旋轉數組的最小數字

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。
NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。

初始思路:旋轉數組必然是兩個非遞減序列的拼接,在連接處才可能出現前項大于后項。

class Solution { public:int minNumberInRotateArray(vector<int> rotateArray) {for(int i=0;i<rotateArray.size()-1;i++){if(rotateArray[i]>rotateArray[i+1]){return rotateArray[i+1];}}return 0;} };

最佳思路:二分查找分界線。

如果中間元素大于第一個元素,則中間元素位于前面的遞增子數組,此時最小元素位于中間元素的后面。我們可以讓第一個指針left指向中間元素。移動之后,第一個指針仍然位于前面的遞增數組中。如果中間元素小于第一個元素,則中間元素位于后面的遞增子數組,此時最小元素位于中間元素的前面。我們可以讓第二個指針right指向中間元素。移動之后,第二個指針仍然位于后面的遞增數組中。

由于本題不是嚴格遞增序列,還需要考慮left,right,mid指向數組元素都相同時的特殊情況,出現此情況只能順序查找。

class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) {int size = rotateArray.size(); if(size == 0){ return 0; } int left = 0,right = size - 1; int mid = 0; while(rotateArray[left] >= rotateArray[right]){ if(right - left == 1){ mid = right; break; } mid = left + (right - left) / 2; if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){ return MinOrder(rotateArray,left,right); } if(rotateArray[mid] >= rotateArray[left]){ left = mid; } else{right = mid; } } return rotateArray[mid]; }private: int MinOrder(vector<int> &num,int left,int right){ int result = num[left]; for(int i = left + 1;i < right;++i){ if(num[i] < result){ result = num[i]; } } return result; }};
  • 斐波那契數列

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。n<=39

思路:斐波那契數列:f[n]=f[n-1]+f[n-2]。切記不要用遞歸,重復計算次數太多,會發生棧溢出。

用循環解決,可以開數組,需要消耗內存空間。實際只和兩個變量f[n-1]和f[n-2]有關。

class Solution { public:int Fibonacci(int n) {if(n<=0)return 0;if(n==1||n==2)return 1;int t1=1;int t2=1;for(int i=3;i<=n;i++){t2=t1+t2;t1=t2-t1;}return t2;} };
  • 跳臺階

一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思路:最簡單的動規。遞推公式等于斐波那契數列。與上題相同,初始值稍有改動,t2=2。

  • 變態跳臺階

一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

初始思路:按上題想法思考,遞推公式為:f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)

class Solution { public:int jumpFloorII(int number) {int dp[number+1]; int sum=0; for(int i=1;i<=number;i++){dp[i]=sum+1;sum=sum+dp[i];}return dp[number];} };

最佳思路:其實遞推公式可優化。

f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) =
f(0) + f(1) + f(2) + f(3) + … + f(n-2)

f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) +
f(n-1) = f(n-1) + f(n-1)

可以得出: f(n) = 2*f(n-1) = 2^(n-1)

class Solution { public:int jumpFloorII(int number) {return 1<<--number;} };
  • 矩形覆蓋

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

思路:因為大矩形是2*n的,最小單位覆蓋方式有兩種,一個豎放和兩個橫放。轉變為上面的跳臺階問題。

  • 二進制中1的個數

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。

思路:一道常見的筆試題,給出代碼求答案那種233。

class Solution { public:int NumberOf1(int n) {int count=0;while(n){n=n&(n-1);count++;}return count;} };

總結

以上是生活随笔為你收集整理的剑指offer(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。