Leetcode - Array [持續(xù)更新]

15. 3Sum --- Medium
16. 3Sum Closest --- Medium
560. Subarray Sum Equals K --- Medium
189. Rotate Array --- Medium

1. 三數(shù)之和等于0 (Leetcode 15)

Leetcode 15

思路:
暴力解法 - for循環(huán)3輪,找到結(jié)果集,去重。但這效率太低,需要更高效的方法。

很容易想到先排序,再處理??炫?,o(n * log n)時間復(fù)雜度。
接下來遍歷該數(shù)組,對于其中的每一個元素nums[i],找到另外兩個元素nums[j] + nums[k] == nums[i].
其中對于每一個元素nums[i], j 初始化為 i+1, k 初始化為 length -1.
根據(jù)nums[j] + nums[k] 與 nums[i] 的大小比較,決定 j 往后移動,或者 k 往前移動,找滿足條件的結(jié)果。

另外,需要注意,結(jié)果的list是不能包含重復(fù)組合的。
那么在遍歷過程中,有兩個地方需要處理好,才能把重復(fù)組合去掉:第 1 點是,遍歷nums,移到 i,如果nums[i] == nums[i - 1],那么當前的 i 是不需要被處理的,直接continue就好;第 2 點是,對于每一個nums[i],在移動 相應(yīng)的 j,k指針時,每當找到一個結(jié)果,需要判斷 j 后面的元素,以及 k 前面的元素,是不是與當前 j,k指向的元素相等,如果相等,直接將 j 往后移動,將 k 往前移動。

2. 最接近指定值的三數(shù)之和 (Leetcode 16)

Leetcode 16

思路:
與上一道3Sum比較類似。先排序。

for循環(huán)遍歷nums,對于每一個nums[i], 用兩個指針 j, k 遍歷后面的元素,初始化 j = i +1, k = length - 1. 定義一個變量 closest 存放最終結(jié)果,初始化為 nums[0] + nums[1] + nums[2].

對于每一輪循環(huán):
比較 mums[i] + nums[j] + noms[k] - target 的絕對值,與 closest - target 的絕對值,兩者的大小。如果前者小,更新closest的值為前者的值。
比較 nums[j] + nums[k] 與 target - nums[i] 的大小,如果前者大,則將 指針 k 往前移,如果前者小,則將指針 j 往后移,若兩者相等,則直接return target作為最終結(jié)果。

循環(huán)結(jié)束,closest的值即為最終結(jié)果。

3. 連續(xù)子數(shù)組的和為指定值K,求這樣的子數(shù)組的個數(shù) (Leetcode 560)

Leetcode 560

思路:
對于求連續(xù)子數(shù)組的和,想到可以先計算出數(shù)組data[i],data[i] 存放的是從第 0 到第 i 個元素的和。
有了data[]數(shù)組之后,那么找和為 K 的連續(xù)子數(shù)組,等同于找data[i] 和 data[j] 的差值為 K 的情況,就可以。但是,這樣時間效率很低,需要N方的時間復(fù)雜度。有沒有更好的方法呢?有,不過比較巧妙。

對于data[i], 如果 i 之前,有某個(或者某幾個)data元素的值為 data[i] - k,那么,data[i] 減去這樣的元素的值,結(jié)果為K,那么這樣的子數(shù)組,就是要找的子數(shù)組。這樣的元素的個數(shù),就是以nums[i]結(jié)尾,和為K的子數(shù)組,的個數(shù)。
那么,可以遍歷data[]數(shù)組,同時用一個HashMap<Integer, Integer>存放data[i]出現(xiàn)的次數(shù),key為data[i],value為data[i]出現(xiàn)的次數(shù)。
對于data[i],先去hashmap里找key為 data[i] - k 相應(yīng)的value,如果有,那么value就是以nums[i]結(jié)尾,符合條件子數(shù)組的個數(shù)。如果沒有,那就沒有唄。
再將data[i] 作為key,加入hashmap,值設(shè)置為1,或者增加1.

遍歷時,注意有種特殊情況,data[i] - k == 0, 也就是data[i] 本身就等于k,這時,結(jié)果直接加1,同時再去hashmap里找data[i]作為key相應(yīng)的value,最后也要將data[i]作為key,再放回hashmap.

整個過程處理好,是o(n)的時間復(fù)雜度。

4. 根據(jù)給定K,旋轉(zhuǎn)數(shù)組(Leetcode 189)

Leetcode 189

思路:
仔細看看Input和Output,有一個很巧妙的規(guī)律。
先將數(shù)組整個反轉(zhuǎn)。接著將前k個反轉(zhuǎn),后面length - k個再反轉(zhuǎn)。就得到Output。
要注意 k 可能大于數(shù)組長度,所以要先對k取模。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 很久以前被第四題:Median of Two Sorted Arrays卡住了,而且discuss看不明白也沒耐心...
    哈莉_奎茵閱讀 7,106評論 0 3
  • to-do:看一下別人寫的題解 https://github.com/981377660LMT/algorithm...
    winter_sweetie閱讀 896評論 1 0
  • 做題,實際寫出例子,然后分析可能遇到的情況,慢慢的,思路就會出來了。 線性表 33. Search in Rota...
    小碧小琳閱讀 1,691評論 0 2
  • 1. Two Sum 用hash可以得到O(n)時間的解法,用python中的enumerate函數(shù),可以獲得元素...
    Morphiaaa閱讀 540評論 0 0
  • 最近正在找實習(xí),發(fā)現(xiàn)自己的算法實在是不能再渣渣,在網(wǎng)上查了一下,發(fā)現(xiàn)大家都在刷leetcode的題,于是乎本渣渣也...
    caoxian閱讀 1,014評論 0 2

友情鏈接更多精彩內(nèi)容