ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Leetcode算法刷题笔记4-贪心

2021-01-05 22:01:47  阅读:179  来源: 互联网

标签:10 饼干 nums int 序列 刷题 Leetcode 贪心


Leetcode算法刷题笔记4-贪心


相关刷题笔记博客
Leetcode算法刷题笔记1-链表
Leetcode算法刷题笔记2-栈、队、堆
Leetcode算法刷题笔记3-递归与回溯

Leetcode 455. 分发饼干

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/assign-cookies/

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1:

输入: g = [1,2,3], s = [1,1] 输出: 1
解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。

示例 2:

输入: g = [1,2], s = [1,2,3] 输出: 2
解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.

1 <= g.length <= 3 * 104
0 <= s.length <= 3 * 104
1 <= g[i], s[j] <= 231 - 1
#include<bits/stdc++.h>
using namespace std;
//Leetcode提交部分 
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
		sort(g.begin(),g.end());//将孩子所需要的糖果 
		sort(s.begin(),s.end());//和糖果大小排序 
		int count_children = 0;//已经满足的孩子数量 
		int try_candies = 0;//试着给了几个糖果数量 
		while(count_children<g.size()&&try_candies<s.size()){
			if(g[count_children]<=s[try_candies]){
				count_children++;
			}
			 try_candies++;//如果当前没有满足,说明后面的也不满足,依然向后移动一位
		}
		return count_children;
    }
};
//Leetcode自行使用编译器(如DEV\VC\VS)测试部分 
int main(){
	int g_vec[3] = {1,2,3};//题目给出的两个输入数组 
	int s_vec[2] = {1,1};
	Solution solve;
	vector<int> g,s;//创建两个动态数组
	for(int i=0;i<3;i++){
		g.push_back(g_vec[i]);
	} 
	for(int i=0;i<2;i++){
		s.push_back(s_vec[i]);
	} 
	cout<<solve.findContentChildren(g,s)<<endl;
	return 0;
}

Leetcode 376. 摆动序列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wiggle-subsequence/

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

示例 1:

输入: [1,7,4,9,2,5] 输出: 6 解释: 整个序列均为摆动序列。

示例 2:

输入: [1,17,5,10,13,15,10,5,16,8] 输出: 7 解释: 这个序列包含几个长度为 7
摆动序列,其中一个可为[1,17,10,13,10,16,8]。

示例 3:

输入: [1,2,3,4,5,6,7,8,9] 输出: 2

如图所示,我们只需要提取每一个递增或者递减序列的极值,就可以构成最长的摇摆序列。

在这里插入图片描述

方法壹 贪心

#include<bits/stdc++.h>
using namespace std;
//Leetcode提交部分 
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        if (n < 2) {
            return n;
        }
        int state = nums[1] - nums[0];
        int count = state != 0 ? 2 : 1;
        for (int i = 2; i < n; i++) {
            int state2 = nums[i] - nums[i - 1];
            if ((state2 > 0 && state <= 0) || (state2 < 0 && state >= 0)) {
                count++;
                state = state2;
            }
        }
        return count;
    }
};
//Leetcode自行使用编译器(如DEV\VC\VS)测试部分 
int main(){
	int g_vec[10] = {1,17,5,10,13,15,10,5,16,8};//题目给出的两个输入数组 
	vector<int> nums;
	for(int i=0;i<10;i++){
		nums.push_back(g_vec[i]);
	}
	Solution solve;
	cout<<solve.wiggleMaxLength(nums)<<endl;
	
	return 0;
}

方法贰 动态规划

#include<bits/stdc++.h>

using namespace std;
//Leetcode提交部分 
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        if(n<2){
            return n;
        }
        int increase = 1;
        int decrease = 1;
        for(int i = 1;i<n;i++){
            if(nums[i-1]<nums[i]){
                increase = max(increase,decrease+1);
            }else if(nums[i-1]>nums[i]){
                decrease = max(increase+1,decrease);
            }
        }
        return max(increase,decrease);
    }
};
//Leetcode自行使用编译器(如DEV\VC\VS)测试部分 
int main(){
	int g_vec[10] = {1,17,5,10,13,15,10,5,16,8};//题目给出的两个输入数组 
	vector<int> nums;
	for(int i=0;i<10;i++){
		nums.push_back(g_vec[i]);
	}
	Solution solve;
	cout<<solve.wiggleMaxLength(nums)<<endl;
	
	return 0;
}

诚邀各校各地有志之士加入我们大学生IT学习群交流:871352155(请各位广告大佬高抬贵手,常讨论学习无关的朋友请出门右拐∑(っ°Д°;)っ)

标签:10,饼干,nums,int,序列,刷题,Leetcode,贪心
来源: https://blog.csdn.net/weixin_43341045/article/details/112251790

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有