LeetCode刷題記錄——day3

来源:https://www.cnblogs.com/humanplug/p/18088194
-Advertisement-
Play Games

1、https://leetcode.cn/problems/gas-station/submissions/514930619/?envType=study-plan-v2&envId=top-interview-150 對於這個問題可以這樣來考慮,將數據看作一個環,如果答案唯一,那麼就意味著從任 ...


1、https://leetcode.cn/problems/gas-station/submissions/514930619/?envType=study-plan-v2&envId=top-interview-150
對於這個問題可以這樣來考慮,將數據看作一個環,如果答案唯一,那麼就意味著從任意一個節點開始尋找,最後都會得到同一個節點的答案,那麼為何不直接從0節點開始呢?
其次,我們可以建立一個total變數來記錄總的油量和消耗量的差的結果,倘若這個值小於0,則一定沒有解,倘若大於零,則說明一定有解。
繼續這個思路,當有解時,我們不妨從i節點出發,設置一個temp變數記錄從i開始到j的剩餘油量。當temp小於0時,說明現在到達的節點j是可以到達的,但是無法到達j+1節點,那麼下次的起點就可以從j+1開始重覆這個過程。
為什麼?
不妨這樣考慮,i到j構成一個弧,同樣,我們假設當前的問題是無解的,那麼我們應該可以用上述方式將j與j+1斷開,把環分成許多的弧。當然我們這裡假設的無解,其實從total就可以看出。那麼假如現在我們發現total大於0了,我們還可以將環分割成這樣的弧嗎?我們不妨0開始,一直分割,假設前面我們分割成了許多弧,最後從某個節點k開始一直遍歷完了卻再也沒有分割出弧。那麼這個末尾的弧可以和第一個弧鏈上嗎?當然可以!假設不可以的話,那麼我們每個弧最終的剩餘油量都不足以支持它到達下一個弧,那麼total不就是小於0了嗎?但我們已經得到了total大於0,所以最後一個弧一定可以和第一個弧連起來,接下來兩個弧變成一個弧,我們將這個新弧看作最後一個弧,那麼他和現在的新的第一個弧會怎麼樣呢,同理,他們還是可以連起來的!由此我們的演算法就明確了:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int len = gas.size();
        vector<int> remaind(len);
        int total = 0,temp = 0;
        int start = 0;
        for(int i=0;i<len;i++){
            total=total+gas[i]-cost[i];
            temp = temp+gas[i]-cost[i];
            if(temp<0){
                temp=0;
                start=i+1;
            }
        }
        return total<0?-1:start;
    }
};

2、https://leetcode.cn/problems/candy/submissions/514952725/?envType=study-plan-v2&envId=top-interview-150
對於這個問題,我們觀察數組,會發現第一個和最後一個元素非常特殊,因為它們只有一個元素和自己相鄰,如果其餘元素都確定了,那麼它們也就確定了,所以我們不妨從第二個和倒數第二個元素開始處理,我們設置兩個變數j,i它們分別從第二個以及倒數第二個開始向後向前遍歷,並且它們會分別比較自己的j-1以及i+1元素,倘若比它們小則不變,大於則比較現在的糖果數量,若是少了則改變糖果數量。最後每個元素都會和自己左右兩個相鄰的元素比較。

class Solution {
public:
    int candy(vector<int>& ratings) {
        int len=ratings.size();
        vector<int> candy(len);
        int total=0;
        for(int i=len-2,j=1;i>=0;i--,j++){
            if(ratings[i]>ratings[i+1]){
                if(candy[i]<=candy[i+1]){
                    total=total+candy[i+1]+1-candy[i];
                    candy[i]=candy[i+1]+1;
                }
            }
            if(ratings[j]>ratings[j-1]){
                if(candy[j]<=candy[j-1]){
                    total=total+candy[j-1]+1-candy[j];
                    candy[j]=candy[j-1]+1;
                }
            }
        }
        total = total+len;
        return total;
    }
};

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用`QProcess`組件實現針對進程的控制管理等。當你在使用Qt進行跨平臺應用程式開發時,經常需要與外部進... ...
  • 對於程式員來說這個單詞完全擁有另外一個含義,Spring指的是一個開源項目,而這個項目非常厲害。而Spring與JSR、JarkataEE淵源頗深。 ...
  • 剛做完一道模板A*,看到這題我直接小腦萎縮了... 阿米諾斯!這怎麼用A*?!——剛開題的我 beeeeeeeeee like 甚至比模板簡單(這是綠的...) 其實會是會但是紙張的是這玩意我不會搞估價函數我草! 然後突然想到能不能把這個狀態下有多少個數字不在目標位置作為估價函數? 我喜歡 \(ID ...
  • 引言 在JDK1.2之前Java並沒有提供軟引用、弱引用和虛引用這些高級的引用類型。而是提供了一種基本的引用類型,稱為Reference。並且當時Java中的對象只有兩種狀態:被引用和未被引用。當一個對象被引用時,它將一直存在於記憶體中,直到它不再被任何引用指向時,才會被垃圾回收器回收。而被引用也就是 ...
  • 拓展閱讀 Devops-01-devops 是什麼? Devops-02-Jpom 簡而輕的低侵入式線上構建、自動部署、日常運維、項目監控軟體 代碼質量管理 SonarQube-01-入門介紹 項目管理平臺-01-jira 入門介紹 缺陷跟蹤管理系統,為針對缺陷管理、任務追蹤和項目管理的商業性應用軟 ...
  • 概述:在C++中,序列點是表達式中確保求值順序的點。其缺失可能導致未定義行為。基礎功能示例演示了自增運算符的序列點,而高級功能示例展示了函數調用的序列點,有助於避免不確定行為。在編寫代碼時遵循序列點規則是確保程式行為可預測的關鍵。 在C++中,序列點是在表達式中保證求值順序的點。未定義的行為通常涉及 ...
  • 概述:C++中的對象切片指通過將派生類對象賦值給基類對象,導致派生部分被“切掉”,只保留基類部分。這可能發生在值傳遞、賦值等操作中。對象切片的基礎功能示例展示了派生類對象賦值給基類對象時的現象,而高級功能示例則展示了通過基類指針實現派生類對象的訪問和多態。 對象切片(Object Slicing)是 ...
  • 效果圖: 方法如下: 1.簡單版(較繁瑣但是直觀): 1.1 定義資料庫模型(models.py)中添加表 class ProductSample(models.Model): # 示例商品表 id = models.AutoField(db_column='ID', primary_key=Tru ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...