LeetCode 熱題 100_每日溫度(72_739_中等_C++)(棧)(暴力破解;棧(從左到右);棧(從右到左))

LeetCode 熱題 100_每日溫度(72_739)

    • 題目描述:
    • 輸入輸出樣例:
    • 題解:
      • 解題思路:
        • 思路一(暴力破解法(雙重循環)):
        • 思路二(棧:從左到右):
        • 思路三(棧:從右到左):
      • 代碼實現
        • 代碼實現(思路一(暴力破解法(雙重循環))):
        • 代碼實現(思路二(棧:從左到右)):
        • 代碼實現(思路三(棧:從右到左)):
        • 以思路二為例進行調試

題目描述:

給定一個整數數組 temperatures ,表示每天的溫度,返回一個數組 answer ,其中 answer[i] 是指對于第 i 天,下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。

輸入輸出樣例:

示例 1:
輸入: temperatures = [73,74,75,71,69,72,76,73]
輸出: [1,1,4,2,1,1,0,0]

示例 2:
輸入: temperatures = [30,40,50,60]
輸出: [1,1,1,0]

示例 3:
輸入: temperatures = [30,60,90]
輸出: [1,1,0]

提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100

題解:

解題思路:

思路一(暴力破解法(雙重循環)):

1、我們需要遍歷每一天的溫度,并找到之后的某一天,找到第一個比當前溫度大的溫度。每次找到一個比當前溫度大的溫度時,計算兩者的天數差,并保存這個結果。如果遍歷完整個數組沒有找到比當前溫度大的溫度,那么該位置的 ans[i] 就是 0。

2、具體思路如下:
① 我們用一個 ans 數組來保存每一天的答案,初始化為 0。
② 外層循環遍歷每一天的溫度。
③ 內層循環從當前天的后一天開始,向后查找溫度較大的那一天。如果找到,則記錄下兩天的天數差。
④ 如果沒有找到比當前溫度更高的溫度,ans[i] 保持為 0。

3、復雜度分析:
① 時間復雜度:O(n2),使用了雙重循環。
② 空間復雜度:O(1),除存儲的答案數組外,使用常數個空間。

思路二(棧:從左到右):

1、解題思路

  • 我們從左往右遍歷溫度數組 temperatures,并通過棧保存尚未找到更高溫度的元素的下標。
  • 每次遇到一個比棧頂元素大的溫度時,就意味著找到了棧頂下標對應的溫度之后的第一個更高溫度。此時就可以計算出天數差并將棧頂元素出棧。
  • 如果當前溫度比棧頂元素的溫度小或相等,則將當前下標壓入棧中。

2、具體思路如下:
① 首先將答案數組賦值為0,從左向右遍歷元素。
② 當前棧非空 且 當前元素大于棧頂元素,則棧頂元素出棧,并計算出天數差(直至此元素不大于棧頂元素,或棧為空)。將當前元素進棧。
③ 其余兩種情況:棧空則直接入棧,當前元素小于等于棧頂元素直接入棧。

3、復雜度分析
① 時間復雜度:O(n),其中 n 是數組中的元素數量。因只遍歷一遍數組。
② 空間復雜度:O(n),最壞的情況下所有的元素都需進棧。

思路三(棧:從右到左):

1、解題思路

  • 我們從右往左遍歷溫度數組 temperatures,并通過棧保存還未遍歷的左側結點可能的更高溫度。
  • 當前棧非空 且 當前元素大于等于棧頂元素,則棧頂元素出棧(直至此元素小于棧頂元素,或棧為空)。將當前元素進棧。
  • 其余兩種情況:棧空則直接入棧。當前元素小于棧頂元素計算天數差并將元素入棧。

2、具體思路如下:
① 首先將答案數組賦值為0,從右向左遍歷元素。
② 當前棧非空 且 當前元素大于等于棧頂元素,則棧頂元素出棧(直至此元素小于棧頂元素,或棧為空)。將當前元素進棧。
③ 其余兩種情況:棧空則直接入棧。當前元素小于棧頂元素直接入棧并計算天數差。

3、復雜度分析
① 時間復雜度:O(n),其中 n 是數組中的元素數量。因只遍歷一遍數組。
② 空間復雜度:O(n),最壞的情況下所有的元素都需進棧(方法三較方法二而言,棧中沒有存儲相同的元素)。

代碼實現

代碼實現(思路一(暴力破解法(雙重循環))):
class Solution1 {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {// 初始化一個大小為 temperatures.size() 的結果數組 ans,默認值為 0vector<int> ans(temperatures.size(), 0);// 遍歷每一天的溫度for (int i = 0; i < temperatures.size(); i++) {// 從當前天的后一天開始遍歷for (int j = i + 1; j < temperatures.size(); j++) {// 如果找到了比當前天溫度大的那一天if (temperatures[j] > temperatures[i]) {// 記錄兩天的天數差ans[i] = j - i;// 跳出內層循環,因為已經找到了第一個比當前溫度大的溫度break;}}}// 返回最終的結果數組return ans;}
};
代碼實現(思路二(棧:從左到右)):
class Solution2 {
public:// dailyTemperatures函數接受一個整數數組temperatures,返回一個與該數組長度相同的結果數組。// 結果數組的每個元素表示從當前天開始,經過多少天溫度才會比當前溫度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 棧,用來存儲溫度數組的索引。vector<int> ans(temperatures.size(), 0);  // 結果數組,初始值為0,大小與輸入數組相同。// 遍歷溫度數組for (int i = 0; i < temperatures.size(); i++) {// 如果棧不為空且當前溫度大于棧頂所對應的溫度// 說明找到了棧頂溫度的下一個較高溫度,記錄間隔天數并彈出棧頂元素。while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {ans[stk.top()] = i - stk.top();  // 計算天數差,更新結果數組。stk.pop();  // 彈出棧頂元素。}stk.push(i);  // 當前天的索引入棧,待后續天數比較。}return ans;  // 返回結果數組,包含每一天的等待天數。}
};
代碼實現(思路三(棧:從右到左)):
class Solution3 {
public:// dailyTemperatures函數接受一個整數數組temperatures,返回一個與該數組長度相同的結果數組。// 結果數組的每個元素表示從當前天開始,經過多少天溫度才會比當前溫度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 棧,用來存儲溫度數組的索引。vector<int> ans(temperatures.size(), 0);  // 結果數組,初始值為0,大小與輸入數組相同。// 從后往前遍歷溫度數組for (int i = temperatures.size() - 1; i >= 0; i--) {// 如果棧不為空且當前溫度大于等于棧頂所對應的溫度// 說明當前天的溫度不能找到比它更高的溫度,因此需要彈出棧頂元素。while (!stk.empty() && temperatures[i] >= temperatures[stk.top()]) {stk.pop();  // 彈出棧頂元素,因為當前溫度比棧頂的溫度要大或者相等,找不到更高的溫度。}// 如果棧不為空,說明棧頂索引對應的溫度大于當前溫度// 那么棧頂索引對應的溫度就是當前溫度的下一個較高溫度。if (!stk.empty()) {ans[i] = stk.top() - i;  // 計算天數差,更新結果數組。}// 將當前天的索引入棧,等待后續天數的比較。stk.push(i);}return ans;  // 返回結果數組,包含每一天的等待天數。}
};
以思路二為例進行調試
#include<iostream>
#include <vector>
#include<stack>
using namespace std;class Solution2 {
public:// dailyTemperatures函數接受一個整數數組temperatures,返回一個與該數組長度相同的結果數組。// 結果數組的每個元素表示從當前天開始,經過多少天溫度才會比當前溫度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 棧,用來存儲溫度數組的索引。vector<int> ans(temperatures.size(), 0);  // 結果數組,初始值為0,大小與輸入數組相同。// 遍歷溫度數組for (int i = 0; i < temperatures.size(); i++) {// 如果棧不為空且當前溫度大于棧頂所對應的溫度// 說明找到了棧頂溫度的下一個較高溫度,記錄間隔天數并彈出棧頂元素。while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {ans[stk.top()] = i - stk.top();  // 計算天數差,更新結果數組。stk.pop();  // 彈出棧頂元素。}stk.push(i);  // 當前天的索引入棧,待后續天數比較。}return ans;  // 返回結果數組,包含每一天的等待天數。}
};
int main(int argc, char const *argv[])
{vector<int> temperatures={73,74,75,71,69,72,76,73};Solution2 s2;vector<int> ans=s2.dailyTemperatures(temperatures);for (auto &i : ans){cout<<i<<" ";}return 0;
}

LeetCode 熱題 100_每日溫度(72_739)原題鏈接
歡迎大家和我溝通交流(????)

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

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

相關文章

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目錄 1 -> 工程模板介紹 2 -> 創建一個新的工程 2.1 -> 創建和配置新工程 2.1.1 -> 創建HarmonyOS工程 2.2.2 -> 創建OpenHarmony工程 1 -> 工程模板介紹 DevEco Studio支持多種品類的應用/元服務開發&#xff0c;預置豐富的工程模板&#xff0c;可以根…

unity3d 背景是桌面3d數字人,前面是web的表單

是可以實現的&#xff0c;但涉及多個技術棧的結合&#xff0c;包括 Unity3D、Web 技術&#xff08;HTML、JavaScript&#xff09;、以及可能的 WebGL 或 WebRTC 技術。大致有以下幾種實現方案&#xff1a; 方案 1&#xff1a;Unity 作為獨立應用&#xff08;桌面端&#xff0…

貓耳大型活動提效——組件低代碼化

1. 引言 貓耳前端在開發活動的過程中&#xff0c;經歷過傳統的 pro code 階段&#xff0c;即活動頁面完全由前端開發編碼實現&#xff0c;直到 2020 年接入公司內部的低代碼活動平臺&#xff0c;滿足了大部分日常活動的需求&#xff0c;運營可自主配置活動并上線&#xff0c;釋…

深度學習系列79:Text2sql調研

參考 https://github.com/topics/text-to-sql 這里是一些資源&#xff1a;https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 這里是綜述文章&#xff1a;https://zhuanlan.zhihu.com/p/647249972 1. 數據集 Spider: 一個跨域的復雜text2sql數據集&a…

Linux 系統負載過高的排查思路

技術探討&#xff1a;Linux系統負載過高的排查思路 在Linux服務器運行過程中&#xff0c;如果系統負載過高&#xff0c;可能會導致性能下降和服務不穩定。以下是針對Linux系統負載過高問題的排查思路和解決方法&#xff1a; 1. 查看系統負載&#xff1a; 使用uptime或top命令查…

【互聯網性能指標】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

linux---天氣爬蟲

代碼概述 這段代碼實現了一個天氣查詢系統&#xff0c;支持實時天氣、未來天氣和歷史天氣查詢。用戶可以通過終端菜單選擇查詢類型&#xff0c;并輸入城市名稱來獲取相應的天氣信息。程序通過 TCP 連接發送 HTTP 請求&#xff0c;并解析返回的 JSON 數據來展示天氣信息。 #in…

Java高頻面試之集合-08

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;詳細說說CopyOnWriteArrayList CopyOnWriteArrayList 詳解 CopyOnWriteArrayList 是 Java 并發包&#xff08;java.util…

【微信小程序 onTabItemTap:精準監聽 TabBar 點擊事件】

onTabItemTap 是微信小程序中的一個頁面生命周期函數&#xff0c;用于監聽用戶點擊 TabBar 上的某個項時的事件。以下是如何運用 onTabItemTap 的詳細說明&#xff1a; 使用場景 onTabItemTap 適用于需要在用戶點擊 TabBar 切換頁面時執行特定邏輯的場景。例如&#xff0c;你…

痙攣性斜頸需要做手術嗎?

痙攣性斜頸的治療是一個涉及多種醫學知識的話題&#xff0c;讓我們從多方面分析這個問題&#xff0c;來談談是否需要進行手術。 首先&#xff0c;我們要明確痙攣性斜頸是一種什么疾病。痙攣性斜頸是一種頸部肌肉異常收縮的疾病&#xff0c;可能導致頭部持續或間歇性地向一側旋…

AOT是什么?

https://www.bilibili.com/video/BV1Es4y1q7Bf?spm_id_from333.788.player.switch&vd_source12d5954938d20d50645e227a6a728c76&p87常規的java代碼是即時解釋執行的&#xff0c;只有熱點代碼才會提前編譯成二進制&#xff0c;并且將java代碼放到別的電腦執行時得安裝j…

【JavaWeb學習Day23】

Maven高級 分模塊設計與開發 分模塊設計&#xff1a;將一個大項目分成若干個子模塊&#xff0c;方便項目的維護、擴展&#xff0c;也方便模塊間的相互引用&#xff0c;資源共享。 策略&#xff1a; 1.策略一&#xff1a;按照功能模塊拆分&#xff0c;比如&#xff1a;公共組…

圖像的特征

圖像的特征主要包括以下幾類&#xff1a; 1. 顏色特征&#xff1a; 直方圖&#xff1a;描述圖像中顏色的分布。 顏色矩&#xff1a;通過顏色的均值、方差等統計量表示顏色分布。 主色調&#xff1a;圖像中占主導地位的顏色。 2. 紋理特征&#xff1a; 灰度共生矩陣&#xff0…

?LeetCode周賽 3468. 可行數組的數目——暴力與數學?

?LeetCode周賽 3468. 可行數組的數目——暴力與數學? 示例 1&#xff1a; 輸入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 輸出&#xff1a;2 解釋&#xff1a; 可能的數組為&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 輸入&…

AF3 squeeze_features函數解讀

AlphaFold3 data_transforms 模塊的 squeeze_features 函數的作用去除 蛋白質特征張量中不必要的單維度&#xff08;singleton dimensions&#xff09;和重復維度&#xff0c;以使其適配 AlphaFold3 預期的輸入格式。 源代碼&#xff1a; def squeeze_features(protein):&qu…

【打卡d4】日期類--分組輸入

第一題&#xff1a;根據一年中的第 n 天計算日期 &#x1f4cc; 知識點 判斷閏年&#xff1a; 閏年條件&#xff1a;能被 400 整除&#xff0c;或 能被 4 整除但不能被 100 整除。平年&#xff1a;2 月 28 天&#xff1b;閏年&#xff1a;2 月 29 天。 累加月份&#xff0c;找…

JAVA(5)-基礎概念

*固定格式 一.注釋和關鍵字 關鍵字&#xff1a;被賦予特定關系的詞 字母全部小寫&#xff0c;如class表示一個類 二.字面量 1.字面量類型 *字符串里面的類型是一句話&#xff0c;用雙引號 字符里面的類型只有一個字或字母 null只能用字符串的方式打印 2.制表符 \t 至少補…

本地部署Navidrome個人云音樂平臺隨時隨地暢聽本地音樂文件

文章目錄 前言1. 安裝Docker2. 創建并啟動Navidrome容器3. 公網遠程訪問本地Navidrome3.1 內網穿透工具安裝3.2 創建遠程連接公網地址3.3 使用固定公網地址遠程訪問 前言 今天我要給大家安利一個超酷的私有化音樂神器——Navidrome&#xff01;它不僅讓你隨時隨地暢享本地音樂…

C++ 中的RAII(資源獲取及初始化)

C 中的RAII(資源獲取即初始化) RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C中一種重要的編程范式&#xff0c;全稱為“資源獲取即初始化”。它是一種通過對象生命周期管理資源&#xff08;如內存、文件句柄、網絡連接等&#xff09;的技術&#x…

藍橋杯嵌入式組第七屆省賽題目解析+STM32G431RBT6實現源碼

文章目錄 1.題目解析1.1 分而治之&#xff0c;藕斷絲連1.2 模塊化思維導圖1.3 模塊解析1.3.1 KEY模塊1.3.2 ADC模塊1.3.3 IIC模塊1.3.4 UART模塊1.3.5 LCD模塊1.3.6 LED模塊1.3.7 TIM模塊 2.源碼3.第七屆題目 前言&#xff1a;STM32G431RBT6實現嵌入式組第七屆題目解析源碼&…