Last updated on 2023年9月14日 晚上
134. 加油站(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int currSum = 0; int totalSum = 0; int start = 0;
for(int i = 0;i < gas.size();i++){ totalSum += gas[i] - cost[i]; currSum += gas[i] - cost[i];
if(currSum < 0){ currSum = 0; start = i + 1; } }
if(totalSum < 0){ return -1; }
return start; } };
|
135. 分发糖果(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: int candy(vector<int>& ratings) { vector<int> candys(ratings.size(), 1);
for(int i = 1; i < ratings.size();i++){ if(ratings[i] - ratings[i - 1] > 0){ candys[i] = candys[i - 1] + 1; } }
for(int i = ratings.size() - 2;i >= 0;i --){ if(ratings[i] - ratings[i + 1] > 0){ candys[i] = max(candys[i], candys[i + 1] + 1); } }
int result = 0; for(int i = 0;i < candys.size();i++){ result += candys[i]; } return result; } };
|
860. 柠檬水找零(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { public: bool lemonadeChange(vector<int>& bills) { int curr_five = 0; int curr_ten = 0; int curr_twenty = 0;
for(int i = 0;i < bills.size();i++){ if(bills[i] == 5){ curr_five += 1; }else if(bills[i] == 10){ curr_ten += 1; if(curr_five <= 0){ return false; }else{ curr_five -= 1; } }else if(bills[i] == 20){ curr_twenty += 1; if(curr_ten >= 1 && curr_five >= 1){ curr_ten -= 1; curr_five -= 1; continue; }else if(curr_five >= 3){ curr_five -= 3; continue; }else{ return false; } } } return true; } };
|
406. 根据身高重建队列(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public:
static bool cmp(const vector<int>& a, const vector<int>& b){ if(a[0] == b[0]){ return a[1] < b[1]; } return a[0] > b[0]; }
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { sort(people.begin(), people.end(), cmp);
vector<vector<int>> result; for(int i = 0;i < people.size();i++){ int pos = people[i][1]; result.insert(result.begin() + pos, people[i]); } return result; } };
|
406. 根据身高重建队列(C++贪心算法实现,将结果队列从vector<vector>替换为list<vector>)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: static bool cmp(const vector<int>& a, const vector<int>& b){ if(a[0] == b[0]){ return a[1] < b[1]; }
return a[0] > b[0]; }
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { sort(people.begin(), people.end(), cmp); list<vector<int>> result; for(int i = 0;i < people.size();i++){ int pos = people[i][1]; std::list<vector<int>>::iterator it = result.begin(); while(pos--){ it++; } result.insert(it, people[i]); } return vector<vector<int>>(result.begin(), result.end()); } };
|
452. 用最少数量的箭引爆气球(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: static bool cmp(const vector<int>& a, const vector<int>& b){ return a[0] < b[0]; }
int findMinArrowShots(vector<vector<int>>& points) { sort(points.begin(), points.end());
int right = points[0][1]; int result = 1;
for(int i = 1; i < points.size();i++){ if(points[i][0] > right){ right = points[i][1]; result++; }else{ right = min(points[i][1], right); } } return result; } };
|
435. 无重叠区间(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: static bool cmp(const vector<int>& a, const vector<int>& b){ return a[0] < b[0]; }
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp); int pre = 0; int result = 0; for(int i = 1;i < intervals.size();i++){ if(intervals[i][0] < intervals[pre][1]){ if(intervals[i][1] < intervals[pre][1]){ pre = i; } result ++; }else{ pre = i; } }
return result; } };
|
763. 划分字母区间(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: vector<int> partitionLabels(string s) { int hash[27] = {0}; for(int i = 0;i < s.size();i++){ hash[s[i] - 'a'] = i; }
vector<int> result; int start = 0; int end = 0;
for(int i = 0;i < s.size();i++){ end = max(end, hash[s[i] - 'a']); if(i == end){ result.push_back(end - start + 1); start = i + 1; } } return result; } };
|
56. 合并区间(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: static bool cmp(const vector<int>& a, const vector<int>& b){ return a[0] < b[0]; }
vector<vector<int>> merge(vector<vector<int>>& intervals) { if(intervals.size() == 1){ return intervals; }
sort(intervals.begin(), intervals.end(), cmp);
int left = intervals[0][0]; int right = intervals[0][1];
vector<vector<int>> result; result.push_back(intervals[0]);
for(int i = 1;i < intervals.size();i++){ if(intervals[i][0] <= right){ vector<int> tmp; tmp.push_back(left); tmp.push_back(max(right, intervals[i][1])); result.pop_back(); result.push_back(tmp); right = max(right, intervals[i][1]); }else{ result.push_back(intervals[i]); left = intervals[i][0]; right = intervals[i][1]; } }
return result;
} };
|
738. 单调递增的数字(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public: int monotoneIncreasingDigits(int n) { string strNum = to_string(n);
int flag = strNum.size();
for(int i = strNum.size() - 1;i > 0;i--){ if(strNum[i - 1] > strNum[i]){ strNum[i - 1]--; flag = i; } }
for(int i = flag;i < strNum.size();i++){ strNum[i] = '9'; }
return stoi(strNum); } };
|
(困难) 968. 监控二叉树(C++贪心算法实现)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: //返回结果的变量 int result = 0; //遍历二叉树,按照从下往上的顺序进行 int traversal(TreeNode* curr){ // 空结点,该结点有覆盖 if(curr == nullptr){ return 2;//返回2(状态2表示该结点为空结点且有覆盖) }
//得到left结点和right结点 int left = traversal(curr->left);//左结点 int right = traversal(curr->right);//右结点
//对中节点情况的处理 //情况1:左右节点都有覆盖 if(left == 2 && right == 2){ return 0;//表示当前父结点 }
//情况2分为如下几种: //left == 0 && right == 0,左右节点无覆盖 //left == 1 && right == 0,左结点有摄像头,右结点无覆盖 //left == 0 && right == 1,左节点无覆盖,右结点有摄像头 //left == 0 && right == 2,左结点无覆盖,右结点有覆盖 //left == 2 && right == 0,左结点有覆盖,右结点无覆盖 if(left == 0 || right == 0){ result++;//表示当左右结点至少有一个结点无覆盖时,在中结点增加摄像头 return 1;//表示增加摄像头 }
//情况3分为如下几种: //left == 1 && right == 2,左节点有摄像头,右结点有覆盖 //left == 2 && right == 1,左结点有覆盖,右结点有摄像头 //left == 1 && right == 1,左右节点均有摄像头 if(left == 1 || right == 1){ return 2;//那么left和right的父亲结点设置为2,表示有覆盖 }
return -1; }
int minCameraCover(TreeNode* root) { result = 0;//初始化结果为0
//表示无覆盖 if(traversal(root) == 0){ result ++; }
return result; } };
|
leetcode-notes-20230914
https://thewangyang.github.io/2023/09/14/leetcode-notes-20230914/