数据结构与算法——贪心算法
文章目錄
- 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; }總結
以上是生活随笔為你收集整理的数据结构与算法——贪心算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客14386 水仙花数
- 下一篇: 数据库高级知识——查询截取分析(一)