【D17】零錢兌換&環(huán)形鏈表Ⅰ/Ⅱ (LC 322&141&142)

322. 零錢兌換

問(wèn)題描述

給定不同面額的硬幣 coins 和一個(gè)總金額 amount找爱。編寫一個(gè)函數(shù)來(lái)計(jì)算可以湊成總金額所需的最少的硬幣個(gè)數(shù)涤姊。如果沒(méi)有任何一種硬幣組合能組成總金額授药,返回 -1界弧。
你可以認(rèn)為每種硬幣的數(shù)量是無(wú)限的粟关。

解題思路

動(dòng)態(tài)規(guī)劃统诺,dp[i]表示湊成總金額為i所需要的最少硬幣個(gè)數(shù)

代碼實(shí)現(xiàn)

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount < 0){
            return -1;
        }

        //dp[i]表示湊成總金額為i所需要的最少硬幣個(gè)數(shù)
        int[] dp = new int[amount + 1];
        dp[0] = 0;
        for(int i = 1; i <= amount; i++){
            //湊成amount金額的硬幣數(shù)量最多為amount個(gè)袱蚓,初始化dp[i]為amount+1等于初始化為正無(wú)窮肮塞,便于后續(xù)取最小值
            dp[i] = amount + 1;
            for(int coin : coins){
                if(i < coin){
                    continue;
                }else{
                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);
                }
            }
        }

        if(dp[amount] == amount + 1){
            return -1;      
        }else{
            return dp[amount];
        }
        
    }
}

141. 環(huán)形鏈表

問(wèn)題描述

給定一個(gè)鏈表版述,判斷鏈表中是否有環(huán)梯澜。
如果鏈表中有某個(gè)節(jié)點(diǎn),可以通過(guò)連續(xù)跟蹤 next 指針再次到達(dá)渴析,則鏈表中存在環(huán)晚伙。 為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來(lái)表示鏈表尾連接到鏈表中的位置(索引從 0 開始)俭茧。 如果 pos 是 -1咆疗,則在該鏈表中沒(méi)有環(huán)。注意:pos 不作為參數(shù)進(jìn)行傳遞母债,僅僅是為了標(biāo)識(shí)鏈表的實(shí)際情況午磁。
如果鏈表中存在環(huán),則返回 true 场斑。 否則漓踢,返回 false 。

解題思路

快慢指針同時(shí)從起點(diǎn)出發(fā)漏隐,若鏈表有環(huán)喧半,必兩個(gè)指針一定會(huì)相遇。
注意青责,因?yàn)槌跏记闆r兩個(gè)指針都位于頭節(jié)點(diǎn)挺据,所以應(yīng)該讓指針先出發(fā),然后再判斷指針的位置是否指向同一個(gè)節(jié)點(diǎn)脖隶。

代碼實(shí)現(xiàn)

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null || head.next == null){
            return false;
        }
        ListNode slow = head, fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
                return true;
            } 
        }
        return false;   
    }
}

142. 環(huán)形鏈表 II

問(wèn)題描述

給定一個(gè)鏈表扁耐,返回鏈表開始入環(huán)的第一個(gè)節(jié)點(diǎn)。 如果鏈表無(wú)環(huán)产阱,則返回 null婉称。

解題思路-哈希集合

采用HashSet來(lái)保存已訪問(wèn)過(guò)的節(jié)點(diǎn),第一個(gè)被再次訪問(wèn)的節(jié)點(diǎn)即為開始入環(huán)的第一個(gè)節(jié)點(diǎn)。


HashSet主要方法

代碼實(shí)現(xiàn)-哈希集合

public class Solution {
    public ListNode detectCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        while(head != null){
            if(set.contains(head)){
                return head;
            }
            set.add(head);
            head = head.next;
        }
        return null;
    }
}

解題思路-雙指針

接著上一題的思路王暗,當(dāng)快慢指針相遇時(shí)悔据,讓一個(gè)新的慢指針指向頭節(jié)點(diǎn)。然后新舊慢指針同時(shí)從頭節(jié)點(diǎn)俗壹、相遇點(diǎn)出發(fā)科汗,再次相遇的位置就是入環(huán)的第一個(gè)節(jié)點(diǎn)。
假設(shè)鏈表環(huán)前有 a 個(gè)節(jié)點(diǎn)绷雏,環(huán)內(nèi)有 b 個(gè)節(jié)點(diǎn)头滔,相遇點(diǎn)再走到環(huán)的起點(diǎn)有c個(gè)節(jié)點(diǎn)。
1.第一次相遇時(shí)
慢指針路程s=a+b-c涎显;
快指針路程是慢指針路程的兩倍2s= a+n*b+b-c,其中b為快指針完整走過(guò)的環(huán)的總?cè)?shù)坤检;
兩式相減得到s=n*b,因此 a+b-c = n*b棺禾,可得a=(n-1)b + c缀蹄。
2.第二次相遇時(shí)
舊的慢指針走過(guò)的路程:(n-1)b + c
新的慢指針走過(guò)的路程:a

代碼實(shí)現(xiàn)-雙指針

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //無(wú)環(huán),返回null
        if(head == null || head.next == null){
            return null;
        }
        //判斷鏈表是否有環(huán)
        boolean hasCycle = false;
        ListNode slow = head, fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
                //快慢指針第一次相遇時(shí)退出循環(huán)
                hasCycle = true;
                break;
            } 
        }

        //無(wú)環(huán)膘婶,返回null
        if(!hasCycle){
            return null;
        }
        //讓原來(lái)的快指針指向頭節(jié)點(diǎn)缺前,成為新的慢指針
        fast = head;
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;  
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悬襟,隨后出現(xiàn)的幾起案子衅码,更是在濱河造成了極大的恐慌,老刑警劉巖脊岳,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逝段,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡割捅,警方通過(guò)查閱死者的電腦和手機(jī)奶躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亿驾,“玉大人嘹黔,你說(shuō)我怎么就攤上這事∧玻” “怎么了儡蔓?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疼邀。 經(jīng)常有香客問(wèn)我喂江,道長(zhǎng),這世上最難降的妖魔是什么旁振? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任获询,我火速辦了婚禮涨岁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筐付。我一直安慰自己卵惦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布瓦戚。 她就那樣靜靜地躺著,像睡著了一般丛塌。 火紅的嫁衣襯著肌膚如雪较解。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天赴邻,我揣著相機(jī)與錄音印衔,去河邊找鬼。 笑死姥敛,一個(gè)胖子當(dāng)著我的面吹牛奸焙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彤敛,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼与帆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了墨榄?” 一聲冷哼從身側(cè)響起玄糟,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袄秩,沒(méi)想到半個(gè)月后阵翎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡之剧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年郭卫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片背稼。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贰军,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雇庙,到底是詐尸還是另有隱情谓形,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布疆前,位于F島的核電站寒跳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竹椒。R本人自食惡果不足惜童太,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧书释,春花似錦翘贮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扯再,卻和暖如春芍耘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熄阻。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工斋竞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秃殉。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓坝初,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钾军。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳄袍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 硬幣兌換 來(lái)源LeetCode, 題目地址<https://leetcode-cn.com/problems/co...
    xuzhougeng閱讀 634評(píng)論 0 1
  • 題目 給定一個(gè)鏈表,判斷鏈表中是否有環(huán)巧颈。 為了表示給定鏈表中的環(huán)畦木,我們使用整數(shù) pos 來(lái)表示鏈表尾連接到鏈表中的...
    禾木清清閱讀 336評(píng)論 0 0
  • 環(huán)形鏈表II 題目 給定一個(gè)鏈表,返回鏈表開始入環(huán)的第一個(gè)節(jié)點(diǎn)砸泛。 如果鏈表無(wú)環(huán)十籍,則返回 null。 為了表示給定鏈...
    飲酒醉回憶閱讀 146評(píng)論 0 1
  • 00141 環(huán)形鏈表 題目描述 給定一個(gè)鏈表唇礁,判斷鏈表中是否有環(huán)勾栗。 實(shí)例 1: 示例 2: 示例 3: 力扣地址 ...
    林昀熙閱讀 240評(píng)論 0 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友盏筐。感恩相遇围俘!感恩不離不棄。 中午開了第一次的黨會(huì)琢融,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,564評(píng)論 0 11