leetcode 分類整理2

2021-10-02 13:49:56 字數 3127 閱讀 9835

69. x的平方根(e)

重點:1. 用x/mx防止溢位;2. 用右中位數防止無限迴圈

744. 尋找比目標字母大的最小字母(e)

重點:字母順序可以迴圈(a>z),且letters陣列是有序的。因此,最後退出迴圈的時候還要判斷:

return letters[l] > target ? letters[l] : letters[0];
540. 有序陣列的單一元素(m)

重點:題目中要求要o(logn)的複雜度,所以應該用二分;如果不要求,用位運算(o(n))。

1) 二分中的判斷,主要是判斷的是num[mid]和num[mid+1]是否相等,就可以判斷單個數字已經出現在前部分還是還沒有出現(前提就是一定保證mid始終指向的是索引為偶數的位)

public int singlenonduplicate(int nums) 

if (nums.length == 1)

int l = 0, r = nums.length-1;

// 有要求的數字的一方一定是奇數個

while (l < r) ;在一次的數字之後,下標一定是

int mid = l + (r - l) / 2;

// 保證mid只指向偶數,這樣就只需要判斷相同數的位置,就可以判斷單個數字在前部分還是後部分

if (mid % 2 == 1) mid--;

if (nums[mid] == nums[mid + 1])

else

}return nums[l];

}

278. 第乙個錯誤的版本(e)

153. 尋找旋轉排序陣列中的最小值

重點:迴圈內的判斷條件

if (nums[mid] > nums[r]) 

else

34.在排序陣列中查詢元素的第乙個和最後乙個位置(m)

重點:兩次二分查詢。分別查詢該數第一次出現的位置和target+1應該出現的位置(該數-1就是所求的end)

public int searchrange(int nums, int target) 

int first = findindex(nums,target);

int last = findindex(nums,target+1);

if (first == nums.length || nums[first] != target) ;

}return new int;

}/**

* 求target第一次出現的位置

* @param nums

* @param target

* @return

*/private int findindex(int nums, int target)

else

}return l;

}

分治,字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

可以分成i的左邊和i的右邊這種子問題的用分治。

引數中一定要能表示開始和結束(比如241題,substring函式可以擷取字串,潛在的表明開始和結束;但是95題不行,所以需要乙個helper函式用來遞迴)。

思路:帶備忘錄(hashmap)的分治演算法,提高對重複子問題的運算效率。

例如2*3-4*5

1. 遇到第乙個符號*:左[2],右[3-4*5]

此時左邊直接返回,右邊(3-4*5)遞迴:

2. 遇到第乙個符號-:左[3],右[4*5]

左邊直接返回,右邊(4*5)遞迴:

3. 遇到第乙個符號*,左4右5,結果20,直接返回到2,(3-4*5)結果-17;

4. 此時2有了第乙個結果結果,繼續遍歷,遇到第二個符號*:左[3-4],右[5]

左邊(3-4)遞迴,右邊直接返回:

5. 遇到第乙個符號-,左3右4,結果-1,直接返回到4,(3-4*5)結果-5;

6. 結果和結果返回給1,得到對應的結果和結果-34和-10;

7. 繼續遍歷(2*3-4*5),遇到第二個符號-:左[2*3],右[4*5],結果-12;

8. 繼續遍歷(2*3-4*5),遇到第三個符號*:左[2*3-4],右[5]

右邊直接返回,左邊(2*3-4)遞迴。。。同上

private hashmap> hm = new hashmap>();

public listdiffwaystocompute(string input)

int g = new int[n+1];

g[0] = 1;

g[1] = 1;

for (int i = 2; i <= n; i++)

}return g[n];

}

95. 不同的二叉搜尋樹ii(m)

思路:由上!!

我們從序列1 ..n中取出數字i,作為當前樹的樹根。於是,剩餘i - 1個元素可用於左子樹,n - i個元素用於右子樹。

現在,我們對序列 1 ... i - 1 重複上述過程,以構建所有的左子樹;然後對 i + 1 ... n 重複,以構建所有的右子樹。

這樣,我們就有了樹根 i 和可能的左子樹、右子樹的列表。

public listgeneratetrees(int n) 

return genehelper(1,n);

}private linkedlistgenehelper(int start, int end)

for (int i = start; i <= end; i++) }}

return res;

}

Linux命令分類整理

uname a 顯示linux系統資訊 uname r 顯示核心發布版本資訊 uptime 顯示系統已經執行的時間和系統負載 hostname 顯示系統主機名 last reboot 顯示系統重啟歷史 date 顯示當前日期和時間 cal 顯示本月日曆 w 顯示誰當前正登入這台主機 whoami 顯...

phpunit assert斷言分類整理

方法名 含義引數 返回值asserttrue 斷言為真 assertfalse 斷言為假 方法名含義 引數返回值 assertnull 斷言為null assertnotnull 斷言非null 方法名含義 引數返回值 assertequals 斷言等於 assertnotequals 斷言大於 a...

phpunit assert斷言分類整理

方法名 含義引數 返回值asserttrue 斷言為真 assertfalse 斷言為假 方法名含義 引數返回值 assertnull 斷言為null assertnotnull 斷言非null 方法名含義 引數返回值 assertequals 斷言等於 assertnotequals 斷言大於 a...