LeetCode 01两数之和02两数相加
力扣
- LeetCode01兩數(shù)之和
- LeetCode02兩數(shù)之加
前言:第一次LeetCode打卡題解,前面組織的打卡活動從今天開始正式開始了,很多csdn和公眾號小伙伴以及加入了,歡迎加入!詳細看力扣打卡計劃。關(guān)注筆者公眾號:bigsai回復(fù)進群即可進入。
LeetCode01兩數(shù)之和
題目描述:
給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target,請你在該數(shù)組中找出和為目標(biāo)值的那 兩個 整數(shù),并返回他們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
分析:
題意就是讓你從數(shù)組中找到兩個位置他們對應(yīng)位置的和為target。
本題主要有暴力和哈希兩種方法:
法一:暴力法
把所有兩兩配對的問題全部遍歷出來,直到找到滿足題意的結(jié)果為止,時間復(fù)雜度O(n2)
代碼:
法二:借助哈希(一次)
對于上述問題,你可能會疑問:能不能快速的直接知道這個數(shù)據(jù)是否存在呢?本題得目標(biāo)是求得兩個位置的和為target。這種問題當(dāng)然可以使用哈希幫忙處理啊:
- 在第一次遍歷你可以用一個HashMap先把各個位置的值-位置當(dāng)成Key-Value存儲,然后進行第二次遍歷只需要判斷這個HashMap中是否存在(target-a[index])值就可以判斷是否存在了。(這種情況要先遍歷一遍,n個元素都要)
但是這種情況遇到兩個相同的元素,只會儲存一個Hash,就會被替代而出現(xiàn)錯誤!
能不能正確且再簡單一點?
答案是可以的,其實我們不需要用hash存儲所有,邊走邊存即可。為什么我們可以這么考慮?因為如果從數(shù)的特性來看: - 數(shù)是一對形式出現(xiàn)的
- 一對有前后位置之分,在遍歷到前的時候不一定會找到后面的元素,但是遍歷到后面的元素前面一定被我們存儲了。
ac代碼為:
/** 3ms*/ public int[] twoSum2(int[] nums, int target) {int a[]=new int[2];Map<Integer, Integer>map=new HashMap<Integer, Integer>();for(int i=0;i<nums.length;i++){if(map.containsKey(target-nums[i])){a[0]=i;a[1]=map.get(target-nums[i]);return a;}else {map.put(nums[i], i); }}return a;}LeetCode02兩數(shù)之加
題目描述:
給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲的,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。
如果,我們將這兩個數(shù)相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
分析:
本題其實就是用一個鏈表存儲一個數(shù)字(逆序存儲),你需要給它計算出結(jié)果后在 逆序 存儲到一個鏈表中返回。
所謂加法的運算規(guī)則:從兩個數(shù)的最低位進行計算,進行到下一位的時候需要考慮進位問題。一直到最后,而本題所給的鏈表剛好可以用來直接計算,因為鏈表頭都是數(shù)字最低位可以直接相加,然后一直遍歷到結(jié)束。可以用一個常數(shù)表示進位。
在具體實現(xiàn)(鏈表)的時候:
- 創(chuàng)建新的鏈表,每次將計算的數(shù)值插入到鏈表尾部即可。
- 需要準確表示進位,并且最后要考慮以下進位
- 妥善返回正確節(jié)點,可以用一個頭節(jié)點用來使得所有節(jié)點都正常操作,而不需要特殊判斷。
通過代碼第一次比較啰嗦的寫法:
當(dāng)然,如果你遍歷鏈表把各個數(shù)字取出來,使用字符串、數(shù)字轉(zhuǎn)換然后相加得到一個數(shù)字,最后在轉(zhuǎn)成字符串、鏈表的理論可以,可以自行實現(xiàn)。
第一次比較臃腫但易理解代碼為:
優(yōu)化后的代碼為:
//更簡潔的寫法public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode node=new ListNode(0);ListNode team=node;int jin=0;//進位while(l1!=null||l2!=null){int num=jin;if(l1!=null){num+=l1.val;l1=l1.next;}if(l2!=null){num+=l2.val;l2=l2.next;}jin=num/10;num%=10;team.next=new ListNode(num);team=team.next;}if(jin!=0)team.next=new ListNode(jin);return node.next;}當(dāng)然,如果遇到評論區(qū)或者其他好的方法也可以,如果我錯誤還請指正。
歡迎關(guān)注微信公眾號:bigsai 回復(fù)進群即可加入一起刷題。目前已有一百多位戰(zhàn)友。
總結(jié)
以上是生活随笔為你收集整理的LeetCode 01两数之和02两数相加的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【排序算法】图解桶排序
- 下一篇: LeetCode精讲 03无重复字符的最