目錄
題目一題目二
給定乙個整數陣列nums
和乙個目標值target
,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的解答(暴力法,時間複雜度:o(n^2),空間複雜度:o(1))
class solution ;}}
}return null;}}
官方解答(一遍雜湊表,時間複雜度:o(n),空間複雜度:o(n))
class solution ;
}map.put(nums[i], i);
}return null;}}
總結:我的解法題目是做出來了,但非常暴力,一點都不優雅,跟官方給的答案差的不是一點半點,我的解法執行用時81ms,而官方的只需9 ms。沒能想到使用map的特性來解決這道題,對線性表、雜湊表等的使用還是不夠熟練。
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 0 -> 8原因:342 + 465 = 807官方解答思路
我們使用變數來跟蹤進製,並從包含最低有效位的表頭開始模擬逐位相加的過程。
圖1,對兩數相加方法的視覺化: 342 + 465 = 807, 每個結點都包含乙個數字,並且數字按位逆序儲存。
演算法
就像你在紙上計算兩個數字的和那樣,我們首先從最低有效位也就是列表l1和l2的表頭開始相加。由於每位數字都應當處於 0…9 的範圍內,我們計算兩個數字的和時可能會出現「溢位」。例如,5 + 7 = 12。在這種情況下,我們會將當前位的數值設定為2,並將進製 carry = 1 帶入下一次迭代。進製 carry 必定是 0 或 1,這是因為兩個數字相加(考慮到進製)可能出現的最大和為 9 + 9 + 1 = 19。
偽**如下:
檢查 carry = 1 是否成立,如果成立,則向返回列表追加乙個含有數字 1 的新結點。
返回啞結點的下乙個結點。
請注意,我們使用啞結點來簡化**。如果沒有啞結點,則必須編寫額外的條件語句來初始化表頭的值。
請特別注意以下情況:
測試用例
說明l1=[0,1]
l2=[0,1,2]
當乙個列表比另乙個列表長時。
l1=l2=[0,1]
當乙個列表為空時,即出現空列表。
l1=[9,9]
l2=[1]
求和運算最後可能出現額外的進製,這一點很容易被遺忘
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
if (carry > 0)
return dummyhead.next;}}
複雜度分析總結:這道題我沒能成功解答出來?。我看到題目第一時間想到的解法是把兩個鍊錶的值分別算出來再相加,算出和之後再分割儲存到鍊錶。但實際動起手來發現無法用**實現,最後沒辦法只能看了官方答案。官方的是從另外乙個思路解決的,做演算法題就像以前做數學題一樣,一道題可能有多種解答方法,要考慮哪種能用**實現,哪種才是最優的。 演算法學習之路
目錄 演算法學習之路 一 前言 一 書籍 二 學習內容 1.空間複雜度,時間複雜度 2.貪心演算法 總結 由於長期沉迷摸魚哲學,感覺自己已經快廢了,決定今天開始學習一些演算法資料充實自己,希望不要三分鐘熱度吧。使用的學習書籍是csdn中自帶的 趣學演算法 看過很多演算法的教學書籍了,開頭都是老面孔了...
演算法學習之路
第一階段 練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡 因為太常用,所以要練到寫時不用想,10 15 分鐘內打完,甚至關掉顯示器都可以把程式打 出來.1.最短路 floyd dijstra,bellmanford 2.最小生成樹 先寫個prim,kruscal要用並查集,不好寫...
演算法學習之路 貪心
基本概念 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀...