力扣刷题--贪心算法第一天
Day24 3.29第24天(贪心算法)
**贪心算法的核心思路是:通过得到局部最优值,进而得到全局最优**
题目一:455.分发饼干
1.求解思路
1.先满足小胃口的人,看在饼干遍历一圈后,能满足多少个人
最先满足胃口小和最先满足胃口大,结果一样。注意是现需要对数组进行排序
class Solution {
//核心思路:从小到大分和从大到小分,好像都是可以的
//从小到大分:是的每个胃口小的都能够尽量满足
public int findContentChildren(int[] g, int[] s) {
//0)对两个集合进行排序
Arrays.sort(g);
Arrays.sort(s);
//1)需要两个指针指向数组的开始
int result=0;
int g1=0;
int s1=0;
//2)对饼干进行遍历
while(g1<g.length && s1<s.length){
//情况一:饼干满足需求
if(s[s1]>=g[g1]){
result++;
g1++;
s1++;
}else{
//不满足要求,换大一点的饼
s1++;
}
}
return result;
}
}
题目二:376. 摆动序列
1.求解思路
方法一:
1. 核心是求解点前差值和上一个差值,是否是一正一负
最简洁代码:
class Solution {
public int wiggleMaxLength(int[] nums) {
//特殊情况
if(nums.length==1) return 1;
int result=1;
int pre=0;
int cur;
for(int i=0; i<nums.length-1;i++){
cur=nums[i+1]-nums[i];
//判断是否满足峰值条件
if( (pre<=0 &&cur>0) || (pre>=0 &&cur<0) ){
result++;
pre=cur;
}
}
return result;
}
}
方法二:
自己写的代码:设置一个差数组:重要的一点就是初值的赋予。
1)如果都是一样的,初值为1,如果有不一样的,初值为2
2)根据相邻数乘积为负数进行判断
class Solution {
public int wiggleMaxLength(int[] nums) {
//0)特殊情况:如果只有一个元素和两个元素相等情况(易错点:先考虑特殊)
if(nums.length==1) return 1;
//1)得到一个作差数组
int[] cha=new int[nums.length-1];
for(int i=1;i<nums.length;i++){
cha[i-1]=nums[i]-nums[i-1];
}
System.out.println(Arrays.toString(cha));
//2)定义结果数,赋初值为1;
int result=1;
//找到不为0的数,赋初值2
int t=0;
while(t<cha.length){ //不是最后一个,且取值为0
if(cha[t]!=0){
result=2;
break;
}else{
t++;
}
}
//3)对差值集合遍历
for(int i=t,j=i+1;j<cha.length;){
//满足条件
if(cha[i]*cha[j]<0){
result++;
i=j;
j++;
}else{
//不满足要求
j++;
}
}
//4)返回值
return result;
}
}
题目三:53. 最大子序和
方法一:
- 如果连续的数之和为负数,则抛弃;保留连续和为正数的值,然后赋给最大值
最简洁代码:
class Solution {
public int maxSubArray(int[] nums) {
//核心思路:如果求和为负数,则重新开始,
//1)如果求和为正数,把值赋给它。
int cursum=0;
int maxsum=nums[0];
for(int i=0;i<nums.length;i++){
cursum+=nums[i];
//2)如果现在和大于之前,则保存
if(cursum>maxsum){
maxsum=cursum;
//3)如果和为负值,则抛弃,重新开始
}
if(cursum<0){
cursum=0;
}
}
return maxsum;
}
}
方法二:暴力求解:会超时
class Solution {
public int maxSubArray(int[] nums) {
//暴力求解
//一层循环遍历初始位置,另一层循环遍历数组找最大值
int maxsum=nums[0];
for(int i=0; i<nums.length;i++){
int cursum=0;
for(int j=i; j<nums.length;j++){
cursum+=nums[j];
if(cursum>=maxsum){
maxsum=cursum;
}
}
}
return maxsum;
}
}
题目四:122. 买卖股票的最佳时机 II
1.求解思路
核心思路:然后在边界内进行遍历,不断扩充边界大小,
class Solution {
public int maxProfit(int[] prices) {
//核心思路:形成一个作差数组,把正数加起来
//1)形成差数组
int result=0;
for(int i=0;i<prices.length-1;i++){
if(prices[i+1]-prices[i]>0){
result+=prices[i+1]-prices[i];
}
}
return result;
}
}
题目五:55. 跳跃游戏
1.求解思路
核心思路:然后在边界内进行遍历,不断扩充边界大小,
class Solution {
public boolean canJump(int[] nums) {
//核心思路:遍历0-n-1个数,不断扩增其边界值
//1)特殊情况
if(nums.length<=1) return true;
//2)一般情况:不断扩大边界,不断进行遍历,
int maxbro=0;
for(int i=0; i<=maxbro ;i++){
int temp=i+nums[i];
if(temp>maxbro) maxbro=temp;
if(maxbro>=nums.length-1) {
return true;
}
}
//3)如果不满足返回条件,那么就是没有达到最后一步
return false;
}
}