/**
* 題目
* 給定乙個整數陣列 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,把所有小...