日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法——贪心算法

發布時間:2024/7/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法——贪心算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 1.分發餅干
          • 1.1 題目描述
          • 1.2 解題思路
          • 1.3 C++實現
        • 2.擺動序列
          • 2.1 題目描述
          • 2.2 解題思路
          • 2.3 C++實現
        • 3.移掉K位數字
          • 3.1 題目描述
          • 3.2 解題思路
          • 3.3 C++實現
        • 4.跳躍游戲
          • 4.1 題目描述
          • 4.2 解題思路
          • 4.3 C++實現
        • 5.跳躍游戲 II
          • 5.1 題目描述
          • 5.2 解題思路
          • 5.3 C++實現
        • 6.用最少數量的箭引爆氣球
          • 6.1 題目描述
          • 6.2 解題思路
          • 6.3 C++實現
        • 7.最優加油方法
            • 7.1 題目描述
          • 7.2 解題思路
          • 7.3 C++實現

1.分發餅干

1.1 題目描述

假設你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。

對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j] 。如果 s[j] >= g[i],我們可以將這個餅干 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,并輸出這個最大數值。

題目來源于力扣455

1.2 解題思路


1.3 C++實現
class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int child=0;int cookie=0;while((child<g.size())&&(cookie<s.size())){if(g[child]<=s[cookie]){child++;}cookie++;}return child;} };

2.擺動序列

2.1 題目描述

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第一個差(如果存在的話)可能是正數或負數。少于兩個元素的序列也是擺動序列。

例如, [1,7,4,9,2,5] 是一個擺動序列,因為差值 (6,-3,5,-7,3) 是正負交替出現的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動序列,第一個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最后一個差值為零。

給定一個整數序列,返回作為擺動序列的最長子序列的長度。 通過從原始序列中刪除一些(也可以不刪除)元素來獲得子序列,剩下的元素保持其原始順序。

2.2 解題思路


2.3 C++實現
class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size()<2){return nums.size();}static const int BEGIN=0;static const int UP=1;static const int DOWN=2;int STATE=BEGIN;int max_length=1;for(int i=1;i<nums.size();i++){switch(STATE){case BEGIN:if(nums[i]>nums[i-1]){STATE=UP;max_length++;}else if(nums[i]<nums[i-1]){STATE=DOWN;max_length++;}break;case UP:if(nums[i]<nums[i-1]){STATE=DOWN;max_length++;}break;case DOWN:if(nums[i]>nums[i-1]){STATE=UP;max_length++;}break;} }return max_length;} };

3.移掉K位數字

3.1 題目描述

給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。

num 的長度小于 10002 且 ≥ k。
num 不會包含任何前導零。

3.2 解題思路



3.3 C++實現
class Solution { public:string removeKdigits(string num, int k) {vector<int> S;string result="";for(int i=0;i<num.length();i++){int number=num[i]-'0';while(S.size()!=0&&S[S.size()-1]>number&&k>0){S.pop_back();k--;}if(S.size()!=0||number!=0){S.push_back(number);}}while(S.size()!=0&&k>0){S.pop_back();k--;}for(int i=0;i<S.size();i++){result.append(1,'0'+S[i]);}if(result==""){return "0";}return result;} };

4.跳躍游戲

4.1 題目描述

給定一個非負整數數組 nums ,你最初位于數組的 第一個下標 。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最后一個下標。

4.2 解題思路


4.3 C++實現
class Solution { public:bool canJump(vector<int>& nums) {vector<int> index;for(int i=0;i<nums.size();i++){index.push_back(i+nums[i]);}int max_index=index[0];int jump=0;while(jump<index.size()&&jump<=max_index){if(max_index<index[jump]){max_index=index[jump];}jump++;}if(jump==nums.size()){return true;}return false;} };

5.跳躍游戲 II

5.1 題目描述

給定一個非負整數數組,你最初位于數組的第一個位置。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達數組的最后一個位置。

5.2 解題思路

5.3 C++實現
class Solution { public:int jump(vector<int>& nums) {if(nums.size()<2){return 0;}int current_max_index=nums[0];int pre_max_max_index=nums[0];int jump=1;for(int i=0;i<nums.size();i++){if(i>current_max_index){jump++;current_max_index=pre_max_max_index;}if(pre_max_max_index<nums[i]+i){pre_max_max_index=nums[i]+i;}}return jump;} };

6.用最少數量的箭引爆氣球

6.1 題目描述

在二維空間中有許多球形的氣球。對于每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束坐標。由于它是水平的,所以縱坐標并不重要,因此只要知道開始和結束的橫坐標就足夠了。開始坐標總是小于結束坐標。

一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在坐標 x 處射出一支箭,若有一個氣球的直徑的開始和結束坐標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之后,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。

給你一個數組 points ,其中 points [i] = [xstart,xend] ,返回引爆所有氣球所必須射出的最小弓箭數。

6.2 解題思路


6.3 C++實現
class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if(points.size()==0){return 0;}sort(points.begin(),points.end());int shoot_num=1;int shoot_begin=points[0][0];int shoot_end=points[0][1];for(int i=1;i<points.size();i++){if(shoot_end>=points[i][0]){shoot_begin=points[i][0];if(shoot_end>points[i][1]){shoot_end=points[i][1];}}else{shoot_num++;shoot_begin=points[i][0];shoot_end=points[i][1];}}return shoot_num;} };

7.最優加油方法

7.1 題目描述

7.2 解題思路

7.3 C++實現
#include <iostream> #include<vector> #include<queue> #include<algorithm> using namespace std;bool cmp(pair<int, int>& a, pair<int, int>& b) {return a.first > b.first; }int get_min_stop(int L, int P, vector < pair<int, int>>& stop) {priority_queue<int> Q;int result = 0;stop.push_back(make_pair(0, 0));sort(stop.begin(), stop.end(), cmp);for (int i = 0; i < stop.size(); i++) {int dis = L - stop[i].first;while (dis > P && !Q.empty()) {P = P + Q.top();Q.pop();result++;}if (Q.empty() && dis > P) {return -1;}P = P - dis;L = stop[i].first;Q.push(stop[i].second);}return result; } int main() {vector<pair<int,int>> stop;int L, P;L = 25;P = 10;stop.push_back(make_pair(4, 4));stop.push_back(make_pair(5, 2));stop.push_back(make_pair(11, 5));stop.push_back(make_pair(15, 10));cout << "加油次數:" << get_min_stop(L, P, stop) << endl;return 0; }

總結

以上是生活随笔為你收集整理的数据结构与算法——贪心算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。