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 ;}}
