日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 01两数之和02两数相加

發(fā)布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 01两数之和02两数相加 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

力扣

    • 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)

代碼:

/** 時間60ms */public int[] twoSum(int[] nums, int target) {int a[]=new int[2];for(int i=0;i<nums.length;i++){for(int j=i+1;j<nums.length;j++){if(nums[i]+nums[j]==target){a[0]=i;a[1]=j;return a;}}}return a;}

法二:借助哈希(一次)

對于上述問題,你可能會疑問:能不能快速的直接知道這個數(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)。
第一次比較臃腫但易理解代碼為:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode node=new ListNode(0);//用一個頭節(jié)點(不存真實的值)ListNode team=node;int jin=0;//進位while(l1!=null&&l2!=null)//當(dāng)可以正常相加時候{int num=l1.val+l2.val+jin;//該位理論的數(shù)字jin=num/10;//進位0 或 1num%=10;//實際能表示的數(shù)字team.next=new ListNode(num);//將數(shù)字放到下一個節(jié)點中team=team.next;//往下進行l1=l1.next;l2=l2.next;}//其中一個為null或全為null時候while (l1!=null) {int num=l1.val+jin;jin=num/10;num%=10;team.next=new ListNode(num);team=team.next;l1=l1.next;}while (l2!=null) {int num=l2.val+jin;jin=num/10;num%=10;team.next=new ListNode(num);team=team.next;l2=l2.next;}if(jin!=0)team.next=new ListNode(jin);return node.next;}

優(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。