滑動窗口練習(三)— 加油站問題

題目
測試鏈接
在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas[i] 升。

你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i+1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發,開始時油箱為空。

給定兩個整數數組 gas 和 cost ,如果你可以按順序繞環路行駛一周,則返回出發時加油站的編號,否則返回 -1 。如果存在解,則 保證 它是 唯一 的。

解釋一下這道題,如下圖所示:
路程數組gas和油耗數組cost,假設從A點出發,走到B點路程為1,消耗油量為2,1 - 2 = -1,油量不夠支撐走到B點,所以如果從A點出發,無法完整的繞完一圈,B、C、D同理,這道題就是看從哪個出發點出發后,可以順利的繞完一圈(gas和cost等長)。
在這里插入圖片描述

滑動窗口
首先,先將給定的 gas[] 和 cost[] 稍稍加工一下,一次遍歷,用gas[i] - cost[i],得到的新數組中包含正負數,就是從每個點出發的路程和油耗的差值,看是否有能力到達下一個目的地。

此時如果用暴力方法解這道題的話,只需要從0 ~ N - 1每個位置循環遍歷,遍歷N個位置。看過程中是否出現負數,如果是負數,則說明不能完成循環,如果不是,結果 >= 0,則證明可以完成循環。

我們這里直接說用滑動窗口的解題思路:
依然是先加工gas[] 和 cost[],不同的是,我們要根據加工出來的gas[] - cost[],搞出來一個2倍gas[]長度的前綴和數組

因為我們要看從 0 ~ N - 1位置中每個的出發點能否成功繞回來, gas[] - cost[] 加工出來的數組就是從每個點出發能否成功到達下一目的地的數組,所以當累加到N - 1位置時,下一步重新在加上 0 位置的值,來構造出這個2倍長度累加和數組。

這樣的做的目的是,我下圖中 double.length中下標4的位置,可以看做是從B點出發,又重新繞回A的0位置,下標5的位置,可以看做是從C點出發,重新繞回B點的1位置。一個數組全部可以搞定。

所有原始數組中出發的位置,在double.length中都可以將原始數組的累加和數組加工出來。
在這里插入圖片描述

怎么加工?
假設我從D點出發,那么在gas - cost中求出來的累加和數組就是{3,2,2,4}(因為要重新往A點加繞回來),對應在double.length中就是劃線部分,怎么得出來的呢?
劃線數組中的每一個數,都減去劃線部分的前一個數(1)。
在這里插入圖片描述
所以,綜上所述,此時我們維護一個窗口最小值,窗口范圍就是gos.length,每次窗口變化后,根據窗口內最小值 - 前一個值,如果此時已然 < 0,則說明該位置不是最佳出發點。否則就認為是最佳出發點。

代碼

   public static int canCompleteCircuit(int[] gas, int[] cost) {boolean[] booleans = goodArray(gas, cost);for (int i = 0; i < booleans.length; i++) {if (booleans[i]) {return i;}}return -1;}public static boolean[] goodArray(int[] gas, int[] cost) {int N = gas.length;int M = N << 1;int[] arr = new int[M];for (int i = 0; i < N; i++) {arr[i] = gas[i] - cost[i];arr[N + i] = gas[i] - cost[i];}for (int j = 1; j < M; j++) {arr[j] += arr[j - 1];}LinkedList<Integer> w = new LinkedList<>();for (int i = 0; i < N; i++) {while (!w.isEmpty() && arr[w.peekLast()] >= arr[i]) {w.pollLast();}w.addLast(i);}boolean[] ans = new boolean[N];for (int offset = 0, i = 0, j = N; j < M; offset = arr[i++], j++) {if (arr[w.peekFirst()] - offset >= 0) {ans[i] = true;}if (w.peekFirst() == i) {w.pollFirst();}while (!w.isEmpty() && arr[w.peekLast()] >= arr[j]) {w.pollLast();}w.addLast(j);}return ans;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211482.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211482.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何教會小白使用淘寶API接口獲取商品數據

隨著互聯網的普及&#xff0c;越來越多的人開始接觸網絡購物&#xff0c;而淘寶作為中國最大的電商平臺之一&#xff0c;成為了眾多消費者首選的購物平臺。然而&#xff0c;對于一些小白用戶來說&#xff0c;如何通過淘寶API接口獲取商品數據可能是一個難題。本文將詳細介紹如何…

Python學習之——時間和日期

Python學習之——時間模塊 參考time 模塊常見接口 datetime 模塊常見接口 calendar 模塊常見接口 示例 參考 Python datetime模塊詳解、示例 搞定Python時區的N種姿勢 calendar – 日歷相關 time 模塊 在Python中&#xff0c;通常有這幾種方式來表示時間&#xff1a; 1&…

浮點數在計算機中如何存儲

舉例&#xff1a; 結果&#xff1a; 文字描述&#xff1a; 先將浮點數轉化為二進制的表示形式&#xff0c; 接著將其二進制的形式按照科學計數法來表示&#xff0c; 符號位的確定&#xff1a;正數0&#xff0c; 負數1 指數的確定&#xff1a;將其二進制表示成為科學計數法…

Fall in love with English

Fall in love with English 愛上英語 Hiding behind the loose dusty curtain, a teenager packed up his overcoat into the suitcase. 躲藏在布滿塵土的松軟的窗簾后邊&#xff0c;一個年輕人打包他的外套到行李箱中。 He planned to leave home at dusk though there was th…

超完整的mysql安裝配置方法(包含idea和navicat連接mysql,并實現建表)

mysql安裝配置方法 1、下載mysql2、解壓到指定的安裝目錄3、配置初始化文件my.ini4、配置用戶變量和系統變量5、初始化mysql6、安裝mysql服務并啟動修改密碼7、使用idea連接mysql8、使用Navicat可視化工具連接mysql&#xff0c;并實現新建數據庫&#xff0c;新建表 1、下載mysq…

計算機考研408-計算機網絡、操作系統整書知識點腦圖

計算機網絡、操作系統整書知識點腦圖 今天突然想起來考研期間為了方便記憶&#xff0c;費了很大力氣整理了計算機網絡、操作系統兩本書知識點的腦圖&#xff0c;想著放著也沒啥用&#xff0c;分享出來給大家看看 但是思維導圖格式的東西好像沒法直接發成文章&#xff0c;上傳…

【NodeJs】UniSMS 實現短信驗證碼

承接上文 &#xff0c;上次用的是 短信寶平臺 認證已經通過 后續又新增要求 平臺相當麻煩&#xff01; 短信寶實現短信發送要求&#xff1a; 1.平臺綁定手機號 必須和 營業執照法人一致 2.平臺個人實名認證 必須和 營業執照法人一致 3.平臺需要上傳營業執照 4.平臺需要上…

拒接服務攻擊(DOS)的初步介紹

文章目錄 什么是拒絕服務攻擊拒絕服務攻擊的過程拒絕服務攻擊的類型常見的拒絕服務攻擊如何防范拒絕服務攻擊分布式拒絕服務攻擊&#xff08;DDoS&#xff09; 什么是拒絕服務攻擊 拒絕服務攻擊是一種網絡攻擊方式&#xff0c;攻擊者通過向目標計算機系統或網絡發送大量的請求…

免費分享一套Springboot+Vue前后端分離的在線商城系統,挺實用的

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的SpringbootVue前后端分離的在線商城系統&#xff0c;分享下哈。 項目視頻演示 【免費】SpringbootVue在線商城系統 畢業設計 Java畢業設計_嗶哩嗶哩_bilibili【免費】springbootvue在線商城系統 畢業設計 …

97基于matlab的改進的帶記憶的模擬退火算法求解TSP問題

基于matlab的改進的帶記憶的模擬退火算法求解TSP問題&#xff0c;采用多普勒型降溫曲線描述迭代過程&#xff0c;在傳統算法的基礎上增加記憶功能&#xff0c;可測試中國31/64/144以及att48城市的數據&#xff0c;也可自行輸入數據進行測試&#xff0c;測試結果基本達到當前最優…

Swagger2的使用

手寫Api文檔的幾個痛點&#xff1a; 文檔需要更新的時候&#xff0c;需要再次發送一份給前端&#xff0c;也就是文檔更新交流不及時。 接口返回結果不明確 不能直接在線測試接口&#xff0c;通常需要使用工具&#xff0c;比如postman 接口文檔太多&#xff0c;不好管理 Sw…

gin投票項目4

對應視頻v2版本 gin項目投票系統4 1.增加一個注冊賬號的功能 增加接口 參數校驗&#xff1a;&#xff08;需求&#xff09; 確認密碼需要一致&#xff0c;不為空用戶名必須唯一, 不為空用戶名大于8小于16位密碼大于8小于16位,并且不能為純數字 正則表達式 必須知道這東西…

我對遷移學習的一點理解(系列2)

文章目錄 我對遷移學習的一點理解 我對遷移學習的一點理解 源域和目標域是相對的概念&#xff0c;指的是在遷移學習任務中涉及到的兩個不同的數據集或領域。 源域&#xff08;Source Domain&#xff09;通常指的是已經進行過訓練和學習的數據集&#xff0c;它被用來提取特征、…

Nginx緩存及HTTPS配置小記

緩存基礎 緩存分類 某些場景下&#xff0c;Nginx需要通過worker到上有服務中獲取數據并將結果響應給客戶端&#xff0c;在高并發場景下&#xff0c;我們完全可以將這些數據視為熱點數據&#xff0c;并將其緩存到Nginx服務上。 客戶端緩存&#xff1a;將緩存數據放到客戶端。 …

yolov8與yolov5網絡對比

回顧一下YOLOv5&#xff0c;不然沒機會了 這里粗略回顧一下&#xff0c;這里直接提供YOLOv5的整理的結構圖吧&#xff1a; Backbone&#xff1a;CSPDarkNet結構&#xff0c;主要結構思想的體現在C3模塊&#xff0c;這里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&…

OFDM模糊函數仿真

文章目錄 前言一、OFDM 信號及模糊函數1、OFDM 信號表達式2、模糊函數表達式 二、MATLAB 仿真1、MATLAB 核心源碼2、仿真結果①、OFDM 模糊函數②、OFDM 距離模糊函數③、OFDM 速度模糊函數 前言 本文進行 OFDM 的仿真&#xff0c;首先看一下 OFDM 的模糊函數仿真效果&#xf…

【vim】常用操作

用的時候看看&#xff0c;記太多也沒用&#xff0c;下面都是最常用的&#xff0c;更多去查文檔vim指令集。 以下均為正常模式下面操作&#xff0c;正在編輯的&#xff0c;先etc一下. 1/拷貝當前行 yy&#xff0c;5yy為拷貝包含當前行往下五行 2/p將拷貝的東西粘貼到當前行下…

Nmap腳本的應用場景

網絡安全檢測和漏洞掃描 Nmap腳本是一種強大的工具&#xff0c;可以用于網絡安全檢測和漏洞掃描。在滲透測試工程師的角度下&#xff0c;本文將詳細闡述Nmap腳本的應用場景&#xff0c;以及如何使用Nmap腳本進行網絡安全檢測和漏洞掃描。 一、Nmap腳本的應用場景 Nmap腳本在滲…

Java、JDK、JRE、JVM

Java、JDK、JRE、JVM 一、 Java 廣義上看&#xff0c;Kotlin、JRuby等運行于Java虛擬機上的編程語言以及相關的程序都屬于Java體系的一員。從傳統意義上看&#xff0c;Java社區規定的Java技術體系包括以下幾個部分&#xff1a; Java程序設計語言各種硬件平臺上的Java虛擬機實…

vue的知識點

Vue.js是一個漸進式JavaScript框架&#xff0c;用于簡化Web應用程序開發和管理。下面是Vue.js的一些核心知識點&#xff1a; 1. 數據綁定&#xff1a;Vue.js通過指令和模板語法實現了雙向數據綁定&#xff0c;可以實時更新視圖和模型之間的數據。 2. 組件化開發&#xff1a;V…