演算法,第一周

2021-09-29 20:58:43 字數 3300 閱讀 3522

/**

* 題目

* 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,

* 並返回他們的陣列下標。

* * 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

* * 示例:

* * 給定 nums = [2, 7, 11, 15], target = 9

* * 因為 nums[0] + nums[1] = 2 + 7 = 9

* 所以返回 [0, 1]

*//**

* 我的解題思路主要是對陣列進行迴圈嘗試,比較爛

* 該題的思路是怎麼在不迴圈當前陣列的情況下,獲取所需數是否存在,以及位置,我當時也考慮了能不能一次迴圈解決,

* 但是因為各種原因沒有嘗試,當引以為戒,不能急於求成

* 時間複雜度o(n2)

*/public

class 兩數之和

;return null;}}

}/**

* 第一名的解題思路主要是利用測試用例所包含的數字不大的特點,時間複雜度o(n)

* 先將當前數和目標數相減,得到所需數,同時取反,獲得所需數的去除符號位的補碼值

* 再去尋找對應補碼是否存在記錄,若不存在,將當前數的去除符號位的補碼值位進行記錄

* 但這樣是有bug的,若給定的數與列表中的減數大於2048,會導致精度丟失問題,例如

* ,1這樣的測試用例就會通過該測試,得到結果,因為4096失去精度得到0

* 那直接把陣列設定為int型的最大長度呢?也同樣不行,會導致陣列過大,力扣會報超過記憶體限制的錯誤,

* 本地會報requested array size exceeds vm limit錯誤

* 所以在一般情況下,尤其是數字較小的情況下,這個演算法是最優解,但是極限情況下並不適用,

* 但依然具有很高參考價值

*/class 第一名 ;}

map[

(nums[i]

)& max]

= i +1;

}return null;

}}

/**

* 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,

* 並且它們的每個節點只能儲存 一位 數字。

* * 如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

* * 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

* 示例:

* * 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

* 輸出:7 -> 0 -> 8

* 原因:342 + 465 = 807

*//**

* 這道題我的思路是對前一節點進行求和,設定標誌位解決進製問題,時間複雜度為o(n),

* 第一名的思路和我差不多,但是細節處理的不好,導致比第一名有接近一倍的效能差距,

* 直接看第一名的**吧

*/public

class 兩數相加

else

l1 = l1.next;

l2 = l2.next;

if(l1==null&&l2==null)

listnode.next =

newlistnode(0

);listnode = listnode.next;

}return

this

.listnode;

}public

class

listnode

}class 第一名

l1.val +=

(l2 == null)

? c :

(l2.val + c)

; c =0;

if(l1.val >9)

pre = l1;

l1 = l1.next;

if(l2 != null) l2 = l2.next;}if

(c !=0)

return res;}}

}

/**

* 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

* * 示例 1:

* * 輸入: "abcabcbb"

* 輸出: 3

* 解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

* 示例 2:

* * 輸入: "bbbbb"

* 輸出: 1

* 解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

* 示例 3:

* * 輸入: "pwwkew"

* 輸出: 3

* 解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

* 請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

*//**

* 我的思路是,因為子串是藏在原始字串中的一串字串,而無重複字串無非就是找,

* 藏在原始字串中的一串無重複字串,那麼我們就可以用兩個陣列下標標記這個無重複字串,

* 那麼什麼是無重複字串呢?也就是說字串是不能有任何重複字元的,

* 我們可以用迴圈來查詢我們標記的字串是否與新加入的字串重合,如果重合就將我們的標記初始值向後移動,

* 標記新的字串,並把兩個重複字串中間的字元長度與max取最大,官方和我的思路差不多,

* 但是官方利用了字串的特性,直接獲取重複位置,進而標記重複字串,

* 看來以後一旦碰到這種需要求之前位置的演算法,首先就要考慮能不能直接獲取之前的位置,

* 而不是通過迴圈去找,時間複雜度o(n2)

* */

public

class 無重複字元的最長子串

return math.

max(max,

(chars.length - start));

}/**

* 官方主要是考慮到字元本身只有128位(不包括中文),完全可以利用這個特性,

* 我們只需要考慮將之前出現的字元位置放入到這128位陣列中,如果讀取到了之前的字元,

* 就將標記初始值向後移動,同時修改128位字元存放的位置,以達到記錄的效果,

* 而我還需要繁瑣的尋找重複字元,顯然效率低下,時間複雜度o(n)

*/public

class 官方題解

return ans;}}

}

第4見我寫的部落格詳解,這裡就不多闡述了,因為該題較為麻煩,耗時多天,本週到此為止,開始第二週

Coursera演算法第一周

現在是第三週,剛把第一周做完,要抓緊了。首先是merge sort演算法,採用二分然後遞迴的方法,將時間優化到o nlog n def sort split a,b l a len a l b len b l l a l b l i 0 j 0 for k in range l if i l a a...

演算法訓練第一周

leetcode 283 移動零 基礎寫法 class solution 設定指標i j 遍歷nums i 當nums i 0 即當值不為0時 nums j nums i j int j 0 for int i 0 i i 可以使i j指標同時向右移 只有當nums i 0 j才移動 造成j指標是慢...

第一周演算法複習

第一周演算法複習 2021 11 08 2021 11 14 雖然在c 中有內建的sort函式幫助我們進行時間複雜度為nlogn的快速排序,不過快排的思想和雙指標演算法還是很值得我們學習的 快排的思想 很顯然,快排的關鍵就在於我們怎麼以分界點為界,移動值到分界點的兩邊。開另外兩個陣列a,b,把所有小...