前言:本次分享題目全部來(lái)自力扣網(wǎng),大家可以自行選擇挑戰(zhàn),詳細(xì)鏈接:
118. 楊輝三角 - 力扣(LeetCode)
88. 合并兩個(gè)有序數(shù)組 - 力扣(LeetCode)
26. 刪除有序數(shù)組中的重復(fù)項(xiàng) - 力扣(LeetCode)
目錄
一.楊輝三角
思路:
完整代碼:
二.合并倆個(gè)有序數(shù)組
思路:
完整代碼:
三.刪除有序數(shù)組中的重復(fù)項(xiàng)
思路:
完整代碼:
一.楊輝三角
題目:給定一個(gè)非負(fù)整數(shù)?numRows
,生成「楊輝三角」的前?numRows
?行(1 <= numRows <= 30)
注意:在「楊輝三角」中,每個(gè)數(shù)是它左上方和右上方的數(shù)的和
示例一:
輸入: numRows = 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
?示例二:
輸入: numRows = 1 輸出: [[1]]
思路:
我們可以將楊輝三角圖形進(jìn)行轉(zhuǎn)個(gè)方向,改為一個(gè)階梯型的可能更適合我們理解,對(duì)于這樣的階梯型的數(shù)據(jù),我們很自然就會(huì)聯(lián)想到二維數(shù)組,那楊輝三角可不可以用二維數(shù)組實(shí)現(xiàn)呢?
對(duì)于每一行數(shù)據(jù),第一個(gè)和最后一個(gè)都是1,剩下的數(shù)據(jù)都是上一行的同一位置的數(shù)據(jù)加上前一個(gè)數(shù)據(jù),也就是說(shuō)我們?cè)趯?shí)現(xiàn)每一行的數(shù)據(jù)的時(shí)候都需要用到上一行的數(shù)據(jù)。為了更高效的完成上述的過(guò)程我們可以使用二維的順序表代替二維數(shù)組進(jìn)行操作。
在確定了使用二維順序表后,我們需要定義一個(gè)總的順序表去存放每一行對(duì)應(yīng)的順序表,用外層for循環(huán)確定到底有多少行,用內(nèi)層for循環(huán)確定每一行的元素,以上就確定了本題的大概框架。
對(duì)于幾個(gè)細(xì)節(jié)需要注意:
總結(jié)觀察楊輝三角,所有1的位置都是在每一行的開頭和結(jié)尾,開頭很簡(jiǎn)單內(nèi)層for循環(huán)的 j=0?;的時(shí)候就是開頭位置,而每一行的最后一個(gè)元素,我們仔細(xì)觀察他的坐標(biāo)就會(huì)發(fā)現(xiàn),他的行數(shù)和列數(shù)相等,也就是外層for循環(huán)的循環(huán)變量 i 與內(nèi)層for循環(huán)變量 j 相等的時(shí)候,總結(jié)來(lái)說(shuō)當(dāng)循環(huán)變量 (j == 0 || j == i) 的時(shí)候我們就對(duì)行順序表添加元素 “1”?
對(duì)于非1的數(shù)據(jù),我們需要訪問(wèn)上一行的數(shù)據(jù),通過(guò) .get( i-1) 可以拿到上一行的順序表,拿到上一行的順序表后再分別拿到這一行的 j 位置和 j-1 位置的元素,然后相加,相加后的結(jié)果就是我們要的值,最后再將這個(gè)值使用 .add 添加到這一行的順序表中就可以
完整代碼:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
//新定義一行
List<Integer> row = new ArrayList<>();
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
row.add(1);
}else {
//添加上一行的數(shù)據(jù)(上一行的j-1和j位置)
row.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
}
}
//每一次將新的一行加入總的二維順序表中
ret.add(row);
}
return ret;
}
}
二.合并倆個(gè)有序數(shù)組
題目:給你兩個(gè)按?非遞減順序?排列的整數(shù)數(shù)組?nums1
?和?nums2
,另有兩個(gè)整數(shù)?m
?和?n
?,分別表示?nums1
?和?nums2
?中的元素?cái)?shù)目。請(qǐng)你?合并?nums2
?到?nums1
?中,使合并后的數(shù)組同樣按?非遞減順序?排列。
注意:最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲(chǔ)在數(shù)組?nums1
?中。為了應(yīng)對(duì)這種情況,nums1
?的初始長(zhǎng)度為?m + n
,其中前?m
?個(gè)元素表示應(yīng)合并的元素,后?n
?個(gè)元素為?0
?,應(yīng)忽略。nums2
?的長(zhǎng)度為?n
?。
示例一:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結(jié)果是 [1,2,2,3,5,6]
示例二:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合并 [1] 和 [] 。 合并結(jié)果是 [1]
?示例三:
輸入:nums1 = [0], m = 0, nums2 = [1], n = 1 輸出:[1] 解釋:需要合并的數(shù)組是 [] 和 [1] 。 合并結(jié)果是 [1]
思路:
對(duì)于一個(gè)數(shù)組,我們要將其合并到一個(gè)全新的數(shù)組中,我們可以使用倆個(gè)指針,分別指向倆個(gè)數(shù)組,然后對(duì)比倆個(gè)指針誰(shuí)的值小,小的值就放入新數(shù)組中,并且指針后移
對(duì)于放入數(shù)據(jù)一共有4種情況,我們分別對(duì)應(yīng)處理一下:
-
nums1
的數(shù)據(jù)小于?nums2
的數(shù)據(jù):將?nums1
的數(shù)據(jù)放入新數(shù)組,并且指針pA后移 -
nums1
的數(shù)據(jù)大于?nums2
的數(shù)據(jù):將?nums2
的數(shù)據(jù)放入新數(shù)組,并且指針pB后移 -
nums1
的數(shù)據(jù)已經(jīng)排除完了,但是?nums2
還有元素:將?nums2
的元素放入新數(shù)組,并且指針pB后移 - ?
nums2
的數(shù)據(jù)已經(jīng)排除完了,但是?nums1
還有元素:將nums1
的元素放入新數(shù)組,并且指針pA后移
我們使用一個(gè)while循環(huán)來(lái)包含所有的情況遍歷,然后每一次判斷都將一個(gè)數(shù)據(jù)通過(guò)臨時(shí)變量放入新數(shù)組中,為了和服題目要求,將最后的結(jié)果再覆蓋到數(shù)組1中
完整代碼:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int pA = 0;
int pB = 0;
int cur = 0;
int[] sordNum = new int[m + n];
while (pA < m || pB < n) {
if (pA == m) {//nums1已滿,放入nums2
cur = nums2[pB++];
} else if (pB == n) {//nums2已滿,放入nums1
cur = nums1[pA++];
} else if (nums1[pA] < nums2[pB]) {//nums1的數(shù)據(jù)小于nums2
cur = nums1[pA++];
} else {//nums1的數(shù)據(jù)大于等于nums2
cur = nums2[pB++];
}
sordNum[pA + pB - 1] = cur;
}
for (int j = 0; j != m + n; ++j) {
nums1[j] = sordNum[j];
}
}
}
三.刪除有序數(shù)組中的重復(fù)項(xiàng)
題目:給你一個(gè)?非嚴(yán)格遞增排列?的數(shù)組?nums
?,請(qǐng)你?原地?刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素?只出現(xiàn)一次?,返回刪除后數(shù)組的新長(zhǎng)度。元素的?相對(duì)順序?應(yīng)該保持?一致?。然后返回?nums
?中唯一元素的個(gè)數(shù)。
示例一:
輸入:nums = [1,1,2] 輸出:2, nums = [1,2,_]
示例二:
輸入:nums = [0,0,1,1,1,2,2,3,3,4] 輸出:5, nums = [0,1,2,3,4]
思路:
對(duì)于這里的刪除,我們可以巧妙的利用,具體來(lái)說(shuō)我們可以將不重復(fù)的元素放在數(shù)組前面,然后我們只返回這部分不重復(fù)的元素,這樣就變相的達(dá)到了刪除的目標(biāo)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-751320.html
完整代碼:
class Solution {
public int removeDuplicates(int[] nums) {
//快慢指針
int left = 0;
int right = 1;
while(right < nums.length){
if(nums[left] != nums[right]){
left++;
nums[left] = nums[right];
}
right++;
}
return left + 1;
}
}
??本次的分享就到此為止了,希望我的分享能給您帶來(lái)幫助,也歡迎大家三連支持,你們的點(diǎn)贊就是博主更新最大的動(dòng)力!
如有不同意見(jiàn),歡迎評(píng)論區(qū)積極討論交流,讓我們一起學(xué)習(xí)進(jìn)步!
有相關(guān)問(wèn)題也可以私信博主,評(píng)論區(qū)和私信都會(huì)認(rèn)真查看的,我們下次再見(jiàn)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751320.html
到了這里,關(guān)于算法詳解:楊輝三角 | 合并倆個(gè)有序數(shù)組 | 刪除有序數(shù)組中的重復(fù)項(xiàng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!