代碼隨想錄第27天|貪心算法part1

455.分發餅干

在這里插入圖片描述
先給孩子和餅干排序,每次選取一個最大的餅干給一個最大胃口的孩子,直到餅干分完或者遍歷完孩子

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index = s.size() - 1;int res = 0;for (int i = g.size() - 1; i >= 0; i--) {if (index >= 0 && s[index] >= g[i]) {index--;res++;}}return res;}
};

或者換一種想法,從小到大遍歷餅干,每次分配一個餅干給小朋友,能給index就++

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index = 0;for (int i = 0; i < s.size(); i++) {if (index < g.size() && s[i] >= g[index]) {index++;}}return index;}
};

376.擺動序列

在這里插入圖片描述
如果只有一個元素,則答案為1
如果有兩個元素,則如果兩個元素不相同,答案為2,否則為1
這是需要注意的地方

本題需要繪制一個圖,能看出來峰值的關系
在這里插入圖片描述
只需要把那些非峰值上的點刪除,就是最長的擺動序列
因為對于非峰值的點,其都是無關緊要的
當坡度發生變化時,只需要找到該坡度里的極點即可

局部最優:刪除單調坡度上的節點(不包括單調坡度兩端的節點),那么這個坡度就可以有兩個局部峰值。
整體最優:整個序列有最多的局部峰值,從而達到最長擺動序列

本題要考慮三種情況:

情況一:上下坡中有平坡
在這里插入圖片描述
可以統一規則,刪除前面的3個2,留下最后一個,序列變成[1,2,1],答案為3
在這里插入圖片描述

當 i 指向第一個 2 的時候,prediff > 0 && curdiff = 0 ,當 i 指向最后一個 2 的時候 prediff = 0 && curdiff < 0
當 prediff = 0 && curdiff < 0 也要記錄一個峰值,因為他是把之前相同的元素都刪掉留下的峰值。
所以我們記錄峰值的條件應該是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么如果選擇保留第一個2,刪除其余2的時候,額外的判斷條件應該是prediff!=0 && curdiff=0

情況二:數組首尾兩端
對于左右端點的判斷情況
如果只有兩個不同的元素,那擺動序列也是 2
例如序列[2,5],如果靠統計差值來計算峰值個數就需要考慮數組最左面和最右面的特殊情況。
左端點是沒有prediff的,右端點沒有curdiff,如果不需要寫if特判的話,那么我們需要假設左端點前面有一個虛擬端點,其值和左端點是一樣的,則左端點prediff=0
在這里插入圖片描述
而對于右端點,我們直接假設其已經是一個峰值了(其必定為一個峰值,因為它是最后一個元素,可以畫圖想一下原理,要么就是極值,要么就是擺動的第一個元素),所以我們答案初始就為1
針對以上情形,result 初始為 1(默認最右面有一個峰值),對于左端點,此時 curDiff > 0 && preDiff <= 0,那么 result++(計算了左面的峰值),最后得到的 result 就是 2(峰值個數為 2 即擺動序列長度為 2)

情況三:單調坡中有平坡
我們忽略了一種情況,即 如果在一個單調坡度上有平坡
在這里插入圖片描述
如果按照之前的條件
(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么在最后一個2的時候,result就會+1,這明顯是不對的,因為答案應該為2->序列是[1,4]
之所以會出問題是因為prediff實時更新
我們應該在坡度變化的時候再用curdiff更新prediff,這樣它記錄了之前的坡度方向(大于0和小于0),這樣到1的時候prediff被更新為1,表示是一個上坡,然后坡度沒變化的時候prediff一直是1,到了最后一個2的時候prediff>0,curdiff>0,所以長度不會增加

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1)return nums.size();int curdif = 0;int predif = 0;int res = 1;for (int i = 0; i < nums.size() - 1; i++) {curdif = nums[i + 1] - nums[i];if ((predif <= 0 && curdif > 0) || (predif >= 0 && curdif < 0)) {res++;// 只有坡度變化才記錄predif = curdif;}}return res;}
};

53.最大子數組和

在這里插入圖片描述
貪心
局部最優:當前“連續和”為負數的時候立刻放棄,從下一個元素重新計算“連續和”,因為負數加上下一個元素 “連續和”只會越來越小。

全局最優:選取最大“連續和”
局部最優的情況下,并記錄最大的“連續和”,可以推出全局最優。

從代碼角度上來講:遍歷 nums,從頭開始用 sum 累積,如果 sum一旦加上 nums[i]變為負數,那么就應該從 nums[i+1]開始從 0 累積 sum 了,因為已經變為負數的 count,只會拖累總和。

class Solution {
public:int maxSubArray(vector<int>& nums) {if (nums.size() == 1)return nums[0];int sum = 0;int res = -INT_MAX;for (int i = 0; i < nums.size(); i++) {if (sum <= 0)sum = 0;sum += nums[i];res = max(res, sum);}return res;}
};

前綴和的做法也是可以的,用兩個變量
maxsum和minprefixsum來分別記錄遍歷到的最大子數組和以及最小前綴和
首先計算前綴和數組,sum[0] = 0
maxsum初始化為最小的int,minprefixsum初始化為0.
從前往后依次遍歷各個前綴和,記錄最大的前綴和之差,將其保存在maxsum,因為前綴和之差就是區間和
同時記錄最小的前綴和,因為一個后面的前綴和 sum[i]減去前面最小的前綴和minprefixsum,得到的一定是以當前數nums[i-1]為右端點的最大的區間和

class Solution {
public:int maxSubArray(vector<int>& nums) {if (nums.size() == 1)return nums[0];int n = nums.size();vector<int> sum(n + 1, 0);for (int i = 0; i < nums.size(); i++) {sum[i + 1] = sum[i] + nums[i];}int maxsum = INT_MIN;int minprefixsum = sum[0];for (int i = 1; i <= n; i++) {maxsum = max(maxsum, sum[i] - minprefixsum);minprefixsum = min(minprefixsum, sum[i]);}return maxsum;}
};

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

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

相關文章

Vue3【三】 使用TS自己編寫APP組件

Vue3【三】 使用TS自己編寫APP組件 運行截圖 目錄結構 注意目錄層級 文件源碼 APP.vue <template><div class"app"><h1>你好世界!</h1></div> </template><script lang"ts"> export default {name:App //組…

JavaScript的核心語法

JavaScript JavaScript&#xff1a;JavaScript的組成&#xff1a;核心語法&#xff1a;Hello&#xff1a;變量&#xff1a;JS的基本數據類型&#xff1a;特殊點&#xff1a; 數組&#xff1a;流程控制語句&#xff1a;函數&#xff1a;函數的重載&#xff1a;函數的遞歸:預定義…

在 VSCode 中搭建 Flutter 開發環境并運行項目

要在 Visual Studio Code (VSCode) 中運行 Flutter 項目并啟動虛擬機&#xff08;例如 Android Emulator&#xff09;&#xff0c;可以按照以下步驟進行設置和操作&#xff1a; 一、安裝 Flutter 和 Dart 插件 安裝 Flutter SDK&#xff1a; 前往 Flutter 官網 下載并安裝 Flu…

離散數學答疑 3

&#xff5e;A&#xff1a;A的補集 有時候空集是元素&#xff0c;有時候就是純粹的空集 A-B的定義&#xff1a; 笛卡爾積&#xff1a; 求等價關系&#xff1a;先求劃分再一一列舉 不同劃分&#xff1a;分幾塊。一塊&#xff1a;兩塊&#xff1a;三塊&#xff1a;分別計算 Ix是…

自然語言處理(NLP)—— 主題建模

1. 主題建模的概念 主題建模&#xff08;Topic Modeling&#xff09;是一種用于發現文檔集合&#xff08;語料庫&#xff09;中的主題&#xff08;或稱為主題、議題、概念&#xff09;的統計模型。在自然語言處理和文本挖掘領域&#xff0c;主題建模是理解和提取大量文本數據隱…

【常用工具系列】Git 教程——從入門到大師

目錄 前言一、Git 基礎1-1、Git 簡介與安裝安裝 Git 1-2、 Git 工作流程1-3、 Git 配置與管理用戶配置查看配置 1-4、 Git 倉庫操作克隆倉庫推送更改拉取更新 1-5 Git 分支管理創建分支切換分支刪除分支解決沖突 二、 Git 進階2-0、 Git 標簽使用創建標簽查看標簽檢出標簽推送標…

「動態規劃」如何求最小路徑和?

64. 最小路徑和https://leetcode.cn/problems/minimum-path-sum/description/ 給定一個包含非負整數的m x n網格grid&#xff0c;請找出一條從左上角到右下角的路徑&#xff0c;使得路徑上的數字總和為最小。說明&#xff1a;每次只能向下或者向右移動一步。 輸入&#xff1a;…

《嵌入式系統導論》

計算題 已知位帶別名基地址為0x220000000,計算位于位帶區的0x200FFFFF地址的數據位7,計算它對應的位帶別名區地址。 別名地址=位帶別名基地址+字節偏移量x32+位號x4 別名地址=0x22000000+(0x200FFFFF -0x20000000)*32+7*4=0x220000807 分析如下基本定時器配置語句。 { ………

ctfshow-web入門-命令執行(web37-web40)

目錄 1、web37 2、web38 3、web39 4、web40 命令執行&#xff0c;需要嚴格的過濾 1、web37 使用 php 偽協議&#xff1a; ?cphp://input post 寫入我們希望執行的 php 代碼&#xff1a; <?php system(tac f*);?> 拿到 flag&#xff1a;ctfshow{5c555d9a-6f55…

Mongodb數組元素更新之使用$定位數組第一個元素

學習mongodb&#xff0c;體會mongodb的每一個使用細節&#xff0c;歡迎閱讀威贊的文章。這是威贊發布的第63篇mongodb技術文章&#xff0c;歡迎瀏覽本專欄威贊發布的其他文章。 閱讀了不少Mongodb的文章&#xff0c;也和同事交流過。Mongodb數組更新是比較難理解的地方&#x…

EXCEL多sheet添加目錄跳轉

EXCEL多sheet添加目錄跳轉 背景 excel中有幾十個sheet&#xff0c;點下方左右切換sheet太耗時&#xff0c;希望可以有根據sheet名超鏈接跳轉相應sheet&#xff0c;處理完后再跳回原sheet。 方案一 新建目錄sheet&#xff0c;在A1寫sheet名&#xff0c;右鍵選擇最下方超鏈接…

問題:材料題請點擊右側查看材料問題 查看材料 #學習方法#經驗分享#學習方法

問題&#xff1a;材料題請點擊右側查看材料問題 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

Go 文件壓縮解壓

在Go語言中&#xff0c;archive/zip包提供了創建、讀取和解壓縮ZIP格式文件的功能。 一、創建ZIP文件并添加內容----壓縮 package mainimport ("archive/zip""bytes""fmt""io""log""os" )func main() {// 創建一…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定義二、如果僅回車時候觸發 一、change事件定義 僅在輸入框失去焦點或用戶按下回車時觸發 二、如果僅回車時候觸發 <el-inputv-model.trim"questionInput"placeholder"請輸入你的問題&#xff0c;按回車發送&…

智慧視覺怎么識別視頻?智慧機器視覺是通過什么步驟識別視頻的?

智慧視覺功能怎么識別視頻&#xff1f;智慧視覺是搭載在智能設備比如手機、AI盒子、機器視覺系統上的一個應用程序或特性&#xff0c;采用計算機視覺和人工智能的技術來識別圖像或視頻中的內容。如果想了解視頻識別&#xff0c;就要明白智慧視覺功能會涉及的以下幾個關鍵步驟和…

pxe自動裝機

概念 pxe是c/s模式。允許客戶端通過網絡從遠程服務器&#xff08;服務端&#xff09;下載引導鏡像&#xff0c;加載安裝文件&#xff0c;實現自動化安裝操作系統。 無人值守&#xff1a;安裝選項不需要人為干預&#xff0c;可以自動化實現。 pxe的優點&#xff1a;1.規模化&…

機器人阻抗控制中的機械阻抗模型

機器人阻抗控制中的機械阻抗模型主要涉及到通過修改機器人與環境接觸作業的動力學模型&#xff0c;使其等效為一個期望的阻抗&#xff08;彈簧-質量-阻尼&#xff09;模型。以下是對機械阻抗模型在機器人阻抗控制中的詳細解釋&#xff1a; 阻抗控制原理&#xff1a; 機器人阻抗…

Python——泰坦尼克號數據分析

目錄 ??1.數據集(部分數據) ?? 2、導入數據集與必要模塊 ?? 3.數據預處理 1?? isnull函數查看有無缺失值 2??fillna函數填充缺失值 ?? Age字段使用平均值填充缺失值 ?? Embarked字段填充缺失值 3?? 刪除缺失值較多的字段 ?? 4.數據可視化 1?? di…

流媒體服務器SMS-語音對講(二)

1.簡介 上篇文件介紹了流媒體與設備之間可能的交互場景&#xff0c;本文將介紹客戶端或者web端與攝像頭對講的總體流程。 老規矩&#xff0c;介紹一下本人的開源流媒體&#xff0c;點個star&#xff0c;有興趣一起開發的朋友也可以聯系本人&#xff1a;https://gitee.com/inyem…

PostgreSQL的發布和訂閱功能

發布和訂閱功能在 PostgreSQL 9.0 版本中首次引入,并進一步改進和增強了后續版本中。所以,從 PostgreSQL 9.0 版本開始,就可以使用發布和訂閱功能來實現數據復制和同步 發布和訂閱功能在 PostgreSQL 中提供了一種靈活、可靠的數據復制和同步機制,具有許多優點和一些缺點:…