leetcode刷題記錄 17 中等

2021-10-09 11:07:51 字數 4727 閱讀 5222

題目:

給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。

思路:從頭開始,找到第乙個和》=s的子陣列,然後右指標往右移動1位,左指標移動到使得當前子陣列剛好》=s的位置,更新當前的最小長度

時間複雜度:o(n),空間複雜度:o(1)

/**

* @param s

* @param nums

* @return

*/var minsubarraylen = function(s, nums)

} return min == len + 1 ? 0 : min

};

題目:

現在你總共有 n 門課需要選,記為 0 到 n-1。

在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用乙個匹配來表示他們: [0,1]

給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。

可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回乙個空陣列。

思路:和之前的課程表的思路一樣,只是現在把順序加上而已,拓撲排序

時間複雜度:o(n),空間複雜度:o(n)

/**

* @param numcourses

* @param prerequisites

* @return

*/var findorder = function(numcourses, prerequisites) else

} const res = ;

for (let i = 0; i < numcourses; i++)

} const list = ;

while (res.length)

}} return list.length == numcourses ? list : ;

};

題目:

如果資料結構中有任何與word匹配的字串,則bool search(word)返回true,否則返回false。 單詞可能包含點「。」 點可以與任何字母匹配的地方。

請你設計乙個資料結構,支援 新增新單詞 和 查詢字串是否與任何先前新增的字串匹配 。

實現詞典類 worddictionary :

worddictionary() 初始化詞典物件

void addword(word) 將 word 新增到資料結構中,之後可以對它進行匹配

bool search(word) 如果資料結構中存在字串與 word 匹配,則返回 true ;否則,返回  false 。word 中可能包含一些 '.' ,每個 . 都可以表示任何乙個字母。

思路:先來簡單的,用字首樹的方式儲存每個單詞,然後遍歷字元,遇到'.'就遍歷全部的字元

時間複雜度:o(n),空間複雜度:o(m*k),n為搜尋的單詞的最大長度,m為儲存的單詞的最大長度,k為儲存的單詞的數量

/**

* initialize your data structure here.

*/var worddictionary = function() ;

};/**

* adds a word into the data structure.

* @param word

* @return

*/worddictionary.prototype.addword = function(word) else ;

curdata = curdata[s];

}} curdata.flag = true;

};/**

* returns if the word is in the data structure. a word could contain the dot character '.' to represent any one letter.

* @param word

* @return

*/worddictionary.prototype.search = function(word) else

} else );}}

return curdata.flag||false;

};return deps(0, this.data);

};/**

* your worddictionary object will be instantiated and called as such:

* var obj = new worddictionary()

* obj.addword(word)

* var param_2 = obj.search(word)

*/

仔細觀察,'.'和正則的點的功能是一樣的,所以用正則匹配很方便

/**

* initialize your data structure here.

*/var worddictionary = function() ;

};/**

* adds a word into the data structure.

* @param word

* @return

*/worddictionary.prototype.addword = function(word) else

};/**

* returns if the word is in the data structure. a word could contain the dot character '.' to represent any one letter.

* @param word

* @return

*/worddictionary.prototype.search = function(word)

if(!word.includes('.'))

let reg = new regexp(word);

let res = this.data[word.length].some((item) => );

return res;

};/**

* your worddictionary object will be instantiated and called as such:

* var obj = new worddictionary()

* obj.addword(word)

* var param_2 = obj.search(word)

*/

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

思路:和之前的打家劫舍類似,用動態規劃,區別就是,不能同時取第乙個和最後乙個。所以我們分兩個不同的陣列,乙個子陣列去掉第乙個成員,乙個子陣列去掉最後乙個成員

時間複雜度:o(n),空間複雜度o(1)

/**

* @param nums

* @return

*/var rob = function(nums)

v1 = 0;

let v3 = nums[1];

for (let i = 2; i < l; i++)

return math.max(v2, v3);

};

思路:在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

思路:先來簡單的,排序,然後用下標

/**

* @param nums

* @param k

* @return

*/var findkthlargest = function(nums, k) ;

再來看看怎麼手動實現。

因為需要確定順序,所以想到了快速排序的步驟,快速排序是在陣列中隨機取乙個數,大於該數的在一邊,小於的在另一邊,所以,根據長度我們就能確定我們隨機取的這個數的位置。如果這個數的位置剛好是第k個,那麼這個數就符合我們的條件。這個很像二分法。所以,如果left陣列的長度大於k-1,那麼說明要找的元素在左陣列裡,不需要對右陣列處理;如果小於,那麼在右陣列裡,不需要對做陣列處理。為了方便遞迴的處理,記錄當前左側忽略的陣列的長度

時間複雜度:o(n),.空間複雜度:o(logn)

/**

* @param nums

* @param k

* @return

*/var findkthlargest = function(nums, k) else

}if (left.length + lefl == k - 1) return nums[middle];

if (left.length + lefl > k - 1) return search(left, lefl);

return search(right, lefl + left.length + 1);

};return search(nums);

};

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 除法是...