LeetCode 刷題記錄(5)

2021-10-05 22:47:53 字數 4166 閱讀 3988

這次練習的是leetcode上標籤為陣列、列表為熱題top100、難度為中等的幾道題目。題解有官方題解也有個人題解,有的地方意思可能表達得不是很清楚可能存在錯誤,有問題請提出,感謝❤

題目描述

給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和

n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

示例 1:

輸入: [1,3,4,2,2]

輸出: 2

示例 2:

輸入: [3,1,3,4,2]

輸出: 3

說明

1.不能更改原陣列(假設陣列是唯讀的)。

2.只能使用額外的 o(1) 的空間。

3.時間複雜度小於 o(n2) 。

4.陣列中只有乙個重複的數字,但它可能不止重複出現一次。

題解

1.太菜了?,想半天想不到能滿足說明前兩點的解法,所以還是用了會改變原陣列的解法(當然也可以複製原陣列後用這個解法,但是就不滿足第二點了)。

n+1長度的陣列中,元素範圍是1-n,其中有乙個重複數字.

思路就是:如果假設沒有重複數字,因為元素值範圍在1-n,則其實陣列元素值可以和其下標值相等。那就根據元素值i將nums[ i ]位置置-1

(記得先儲存下nums[ i ]原來的值,不然會少修改一次原來值對應的位置元素)。

當修改時發現位置已經是-1時證明,這是第二次修改此處,即找到重複的值。

(這個方法修改下還可以計算重複了幾次,判斷為負值後不要返回,繼續-1)

class

solution

else

}return-1

;}}

題目描述

給你乙個長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除nums[i] 之外其餘各元素的乘積。

示例:

輸入: [1,2,3,4]

輸出: [24,12,8,6]

提示

題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內。

說明:

請不要使用除法,且在 o(n) 時間複雜度內完成此題。

高階

你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出陣列不被視為額外空間。)

題解

1.一開始可能都會想到直接先遍歷一遍,計算所有元素的乘積,然後再遍歷一遍除以單個值就得到結果了?

但這個方法當陣列中元素值為0的時候就不成立了,題目也提醒了不要用除法。

可以利用索引 i 處左側的所有數字乘積右側所有數字的乘積相乘得到答案。

題目說了output陣列不算額外空間,那就可以利用它來實現空間複雜度為o(1)的演算法了。

對於給定索引 i,output[i] 代表的是 i 左側所有數字的乘積。

用乙個遍歷來跟蹤右邊元素的乘積。

並更新陣列output[i]=output[i]∗rightsum。

然後 rightsum更新為rightsum=rightsum*nums[i]

class

solution

int rightsum =1;

for(

int j = nums.length-

2; j >=

0; j--

)return output;

}}

題目描述

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:

你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

3

/ \9 20

/ \15 7

題解

1.困了,直接copy官方的解題思路:

先序遍歷的順序是 root -> left -> right,這就能方便的從根開始構造一棵樹。

首先,preorder 中的第乙個元素一定是樹的根,這個根又將 inorder 序列分成了左右兩棵子樹。現在我們只需要將先序遍歷的陣列中刪除根元素,然後重複上面的過程處理左右兩棵子樹。

(我這裡的**可能會有點暈,每次遞迴我都是傳整個原陣列進去了,用索引去標記子陣列(子樹)的開始點,莫怪莫怪?)

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

public treenode helper

(int prestart,

int instart,

int size,

int[

] preorder,

int[

]inorder)

treenode root =

newtreenode

(preorder[prestart]);

for(

int index =

0; index < inorder.length; index++)}

return root;

}}

題目描述

給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i

的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明

你不能傾斜容器,且 n 的值至少為 2。

題解

可以暴力解,雙重迴圈求出任兩垂直線間的面積,從中取最大值就好了。

1.也可以用雙指標的方法,面積等於長 * 高,而高又被限制於兩邊垂直線中最短的那條。題中最長比最高好得到,就從最長開始咯。雙指標指向頭尾,每次移動兩條垂直線中短的那條(這樣才有機會面積更大嘛),中間過程中記錄最大值就好啦啦。

class

solution

else

}return maxarea;

}}

leetcode刷題記錄

我覺得每天來兩道,練習練習,再看看人家是怎麼優化的。1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。c 暴力求解,204ms,9.1m class solution for index,num in enumerate ...

LeetCode刷題記錄

動態規劃和貪心演算法的異同點 class solution throw newruntimeexception 時間複雜度 o n 2 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o n o n 的時間。因此時間複雜度為 o n 2 需要一種方法,尋找符合要求的元...

leetcode刷題記錄

工作之餘刷刷題排解下寂寞 1 面試題66.構建乘積陣列 解題思路 題目要求可以簡化為求陣列中任意乙個元素左右兩邊所有元素的乘積。偷懶就用了乙個套路,練習了p c c python class solution def constructarr self,a list int list int 除法是...