CodeTop100 Day17

49、滑动窗口最大值

CodeTop100 Day17_第1张图片

实现一个单调队列,具有push,pop ,max功能,维护一个队列头元素为最大值

比如push操作,将某个值加入队列中,就把小于该值的全部删除然后把它加入队尾,为什么要这样做呢,因为尾部元素最大了,前边的元素也就没什么用了,max函数直接取队列头元素即可,

pop()函数,如果该值等于队头元素就弹出,如果不是就不用管,先填充前k-1个元素到窗口中,然后向右移动,同时添加最大值,然后移除最左边的数字,遍历一遍即可

50、缺失的第一个正数

CodeTop100 Day17_第2张图片

题目要求用O(n)时间和常数空间复杂度,就可以想到不用花里胡哨的 解题了

本质就是让数值放到自己的位置,比如1就是索引0,2就是索引1,然后遍历一遍数组将每个值放入自己的索引位置,主要逻辑是,当nums[i]>0且nums[i]<=数组长度,并且该元素不在自己的位置就进入循环,交换位置,swap(nums[i]-1,i),交换完并不退出循环,看看交换后在该位置的元素是否是他的位置,继续交换直到nums[i]不满足要求,然后遍历一遍nums,如果该位置的值也就是

nums[i]!=i+1就返回i+1,否则就返回数组长度+1

51、零钱兑换

经典dp题,定义dp[n]为凑出该钱的最小硬币数量

递归法:返回dp(coins,amount),dp递归函数定义,出口,if amount==0 return 0,方案数为0,amount<0,方案数为-1,定义当前res=Integer.MAX_VALUE; 遍历coins数组,子问题等于int sub=dp(coins,amount-coin);if(sub==-1)就跳过,res=min(res,sub+1)子问题加1,最后返回如果res是初始值Integer.MAX_VALUE就没有方案为-1,否则就输出res

迭代法:遍历coins数组,状态转移方程为dp[i]=Math.min(dp[i],1+dp[1-coin]);因为要遍历完所有的coins数组所以取遍历中最小的dp[i],最后返回dp[amount];

你可能感兴趣的:(算法,数据结构,leetcode,后端,java,动态规划)