Leetcode 455:分糖果
思路:贪心算法:每次把满足当前胃口最小孩子的最小的饼干分给当前他
代码如下:
class Solution {
public int findContentChildren(int[] g, int[] s) {
// Arrays.sort(s);
// boolean marked[] = new boolean[s.length];
// //Arrays.sort(s);
// int count = 0;
// int index =0;
// if(s==null||g==null) return 0;
// while(index<g.length){
// for(int i=0;i<s.length;i++){
// if(s[i]>=g[index]&& marked[i]!=true) {
// marked[i] =true;
// count++;
// break;
// }
// }
// index++;
// }
// return count;
// }
if(s==null||g==null) return 0;
Arrays.sort(g);
Arrays.sort(s);
int i=0,j=0;
while(i<g.length&&j<s.length){
if(s[j]>=g[i]){
i++;
}
j++;
}
return i;
}
}
Leetcode 376:摆动序列
//贪心 有限状态机
// class Solution {
// private static final int BEGIN =0;
// private static final int UP=1;
// private static final int DOWN =2;
// public int wiggleMaxLength(int[] nums) {
// int state = BEGIN;
// int maxLen =1;
// if(nums.length<2)return nums.length;
// for(int i=1;i<nums.length;i++){
// switch(state){
// case BEGIN:{
// if(nums[i]>nums[i-1]){
// state =UP;
// maxLen++;
// }else if(nums[i]<nums[i-1]){
// state = DOWN;
// maxLen++;
// }
// break;
// }
// case UP:{
// if(nums[i]<nums[i-1]){
// state =DOWN;
// maxLen++;
// }
// break;
// }
// case DOWN:{
// if(nums[i]>nums[i-1]){
// state =UP;
// maxLen++;
// }
// break;
// }
// default:break;
// }
// }
// return maxLen;
// }
//}
//动态规划
class Solution{
public int wiggleMaxLength(int[] nums){
if(nums.length<2) return nums.length;
// int up [] = new int [nums.length];
// int down [] = new int[nums.length];
// down[0] =1;
// up[0] =1;
// for(int i=1;i<nums.length;i++){
// if(nums[i]>nums[i-1]){
// down[i] = down[i-1];
// up[i] =down[i-1]+1;
// }else if(nums[i]<nums[i-1]){
// down[i] =up[i-1]+1;
// up[i] =up[i-1];
// }else{
// down[i] =down[i-1];
// up[i] =up[i-1];
// }
// }
// return Math.max(up[nums.length-1],down[nums.length-1]);
//空间优化
// int down =1;
// int up =1;
// for(int i=1;i<nums.length;i++){
// if(nums[i]>nums[i-1]){
// up = down+1;
// }
// if(nums[i]<nums[i-1]){
// down = up+1;
// }
// }
// return Math.max(up,down);
// }
//贪心算法
}
Leetcode 55: 跳跃游戏1:
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
思路:采用贪心算法:记录当前最远能跳到哪个位置 rightest = max(rightest,num[i]+i)
动态规划,倒着推,从最后一个位置出发,往前推,num[i]+i>=dp,则可以往前跳 dp =i;判断dp==0,到达第一个位置
class Solution {
public boolean canJump(int[] nums) {
//贪心算法
// int rightest = nums[0];
// int index=0;
// while(index<=rightest&&index<nums.length){
// rightest= Math.max(rightest,nums[index]+index);
// index++;
// }
// if(rightest>=nums.length-1) return true;
// else return false;
//倒着推 动态规划
if(nums==null) return false;
if(nums.length==1) return true;
int dp=nums.length-1;
for(int i=nums.length-2;i>=0;i--){
if(nums[i]+i>=dp)
dp = i;
}
return dp==0;
}
}
Leetcode:45 跳跃游戏2
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。
思路:采用贪心算法:记录跳到最远的位置,并认为是当前的边界,当到达了边界,更新边界
class Solution {
public int jump(int[] nums) {
int rightest =0;
int index=0;
int count =0;
int end =0;
if(nums.length==1) return 0;
for(int i=0;i<nums.length-1;i++){
rightest =Math.max(rightest,nums[i]+i);
//更新边界
if(i==end){
end = rightest;
count++;
}
}
return count ;
}
}