劍指offer思路 1 10

2021-09-26 10:06:57 字數 4531 閱讀 2842

1. 二維陣列中的查詢

題:在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。

思路:從右上或者左下(eg.左下,則大的話往右找,小的話往上找)

**:

private static boolean find(int target, int array) 

else if (target < array[i][j])

else }}

return false;

}

注意:在外層迴圈判斷的時候一定要邊界檢測,加j < array[i].length,否則會超出執行時間。

2. 替換空格

題:將乙個字串中的每個空格替換成「%20」

思路:先記錄空格數,然後計算出新字串的長度,從後往前遍歷,增加到新字串中

優點:不用每次遍歷字串,然後後面的所有位後移

**:

public string replacespace(stringbuffer str) 

}int newlength = str.length() + 2 * count;

char array = new char[newlength];

int index = newlength - 1;

for (int i = length - 1; i >= 0; i--)

else

}return new string(array);

}

注意:最後不能用用array.tostring(),這樣的話顯示的是位址,只能用new string(array);

3. 從尾到頭列印鍊錶

思路:遞迴

**:

public arraylistprintlistfromtailtohead(listnode listnode) 

list.add(pnode.val);

}return list;

}

注意:一定要先判斷pnode != null,預防給出listnode為空的情況,否則pnode.next就會報空指標異常

4.※ 重建二叉樹

題:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。

思路:遞迴。找到序列中開始和結束的點。

注意:重點是左子樹結束的點和右子樹開始的點!!!

public treenode reconstructbinarytree(int  pre,int  in) 

private treenode rebuildtree(int pre, int startpre, int endpre, int in, int startin, int endin)

treenode root = new treenode(pre[startpre]);

for (int i = startin ; i <= endin; i++)

}return root;

}

5. 用兩個棧實現乙個佇列

思路:入隊就直接stack.push(),但是出隊的時候,需要判斷必須是乙個棧為空,另乙個不空,就把不空的棧的元素全部壓入另乙個棧(其實就是兩次push)

注意:每次一定要判斷棧是不是空!!!!且兩個棧不能同時為空

**:

public void push(int node) 

public int pop()

}return stack2.pop();

}

6.※旋轉最小數字題:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

思路:因為非遞減,找到前乙個數比後乙個數大的位置i,則這個i+1就是最小數所在的位置。

但是查詢,如果兩兩元素比較時間複雜度較大,用二分。

注意:按刷題模板來!!但是要注意,退出迴圈的時候,要檢查mid是否被更新(以此判斷最後return的是array[mid]還是array[left])。

例如這道題就不能返回array[mid],因為退出迴圈的時候mid還沒有被更新(還是上次的),所以只能返回array[left]。

**:

public int minnumberinrotatearray(int  array) 

if (array.length == 1)

int left = 0, right = array.length - 1;

int mid = -1;

if (array[left] < array[right])

while (left < right) else

}return array[left];

}

7. 斐波那契

**:

public static int solutionfibonacci(int n)else if(n == 1)else

return result[n];

}

int fibonacci(int n) 

return f;

}

其中,f其實是本項的值(從0開始),g是後一項的值。

初始化的時候,f永遠是第乙個能取到的數的值,g是第二項;迴圈條件也是到能取到的第二項(本題是f(1))

如本題中,f是f(0)=0,g是f(1)=1;

返回的永遠是f。

8. 跳台階

思路:1.斐波那契遞迴;2. 類似動規,記錄下前面的結果(假設在第三階,可以從第一階兩步到,此時到第二階有幾種跳法現在也有幾種;也可以用第二階一步到,此時到第一階有幾種跳法現在也有幾種)

int first = 1, second = 2, third = 0;

for (int i = 3; i <= number; i++)

return third;

public int jumpfloor(int target) 

return f;

}

9.**跳台階思路:  1. 遞迴:

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(0) = f(1) = 1

f(n) = 2*f(n-1)

2. 

return  1<
1左移number-1位,即2的(number-1)次方。每個台階都有跳與不跳兩種情況(除了最後乙個台階),最後乙個台階必須跳。所以共用2^(n-1)中情況。

其實就是把這個遞迴化簡了,假設n=3, 那麼f3=2*2*f(1); 假設n=4,那麼f(n)=2*2*2*f(1); 所以結果其實就是:2^(n-1)

10. 矩形覆蓋

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

思路:還是類似斐波那契。target > 2 分為兩步考慮:   

第一次擺放一塊 2*1 的小矩陣,則擺放方法總共為f(target - 1)

第一次擺放一塊1*2的小矩陣,則擺放方法總共為f(target-2)

因為,擺放了一塊1*2的小矩陣(用√√表示),對應下方的1*2(用××表示)擺放方法就確定了,所以為f(target-2)

非遞迴:

if (target <= 0) return 0;

int f = 1,g = 2;

while (target > 1)

return f;

動態規劃:

public int rectcover(int target) 

int pre1 = 1, pre2 = 2;

for (int i = 3; i <= target; i++)

return pre1;

}

牛客劍指offer 1 10題解

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else continue 記憶體集體向右移兩個位元組 並置 0前兩個位元組 v...

劍指offer 醜數(好題,思路)

題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 似乎只能乙個個判過去。判斷是否為醜數的時候,求因子時迴圈停止的條件是到平方根為止。這麼做會超時 而且題目中應該...

牛客網劍指Offer題解C 1 10

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。首先在二維陣列的第一行的數與這個整數比較,找到比這個整數大的位置的前乙個位置,如果都比這個整數小,則這個位置就是第一行的最後乙個位置。...