455.分发饼干 376摆动序列 53最大子序列和 55跳跃游戏 45跳跃游戏II 1005 K次取反后的最大化数组和 134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列

455. 分发饼干

  1. public int findContentChildren(int[] g, int[] s) {
  2. if(s==null||s.length==0){
  3. return 0;
  4. }
  5. Arrays.sort(g);
  6. Arrays.sort(s);
  7. int res=0;
  8. int index=s.length-1;
  9. //遍历胃口,先喂饱大胃王
  10. for(int i=g.length-1;i>=0;i--){
  11. if(s[index]>=g[i]){
  12. res++;
  13. index--;
  14. }
  15. }
  16. return res;
  17. }
  18. 第二种方式:
  19. if(s==null||s.length==0){
  20. return 0;
  21. }
  22. Arrays.sort(g);
  23. Arrays.sort(s);
  24. int res=0;
  25. int index=0;
  26. //遍历饼干,小饼干先喂饱小胃口
  27. for(int i=0;i<s.length&&index<g.length;i++){
  28. if(s[i]>=g[index]){
  29. res++;
  30. index++;
  31. }
  32. }
  33. return res;

376. 摆动序列

  1. int count=1;
  2. int lastDiff=0;
  3. int curDiff=0;
  4. for(int i=1;i<nums.length;i++){
  5. curDiff=nums[i]-nums[i-1];
  6. if((curDiff>0&&lastDiff<=0)||(curDiff<0&&lastDiff>=0)){
  7. count++;
  8. lastDiff=curDiff;
  9. }
  10. }
  11. return count;

53. 最大子数组和

  1. int[]dp=new int[nums.length];
  2. int res=nums[0];
  3. dp[0]=res;
  4. for(int i=1;i<nums.length;i++){
  5. dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
  6. res=Math.max(res,dp[i]);
  7. }
  8. return res;

55. 跳跃游戏

  1. if(nums.length==1){
  2. return true;
  3. }
  4. int cover=0;
  5. for(int i=0;i<=cover;i++){
  6. cover=Math.max(cover,i+nums[i]);
  7. if(i+nums[i]>=nums.length-1){
  8. return true;
  9. }
  10. }
  11. return false;

45. 跳跃游戏 II

  1. if(nums.length==1){
  2. return 0;
  3. }
  4. int res=0;
  5. int maxCover=0;
  6. int curCover=0;
  7. for(int i=0;i<nums.length;i++){
  8. maxCover=Math.max(i+nums[i],maxCover);
  9. if(maxCover>=nums.length-1){
  10. res++;
  11. break;
  12. }
  13. if(i==curCover){
  14. curCover=maxCover;
  15. res++;
  16. }
  17. }
  18. return res;

1005. K 次取反后最大化的数组和

  1. Arrays.sort(nums);
  2. int res=0;
  3. int index=0;
  4. while (index<nums.length){
  5. if(nums[index]<0&&k>0){
  6. nums[index]=-nums[index];
  7. k--;
  8. index++;
  9. }else{
  10. break;
  11. }
  12. }
  13. if(k%2==1){
  14. if(index-1<0) {
  15. nums[index] = -nums[index];
  16. }else if(index==nums.length){
  17. nums[index-1]=-nums[index-1];
  18. }else if(nums[index]<nums[index-1]){
  19. nums[index]=-nums[index];
  20. }else{
  21. nums[index-1]=-nums[index-1];
  22. }
  23. }
  24. for (int num : nums) {
  25. res+=num;
  26. }
  27. return res;

134. 加油站

  1. int curSum=0;
  2. int totalSUm=0;
  3. int res=0;
  4. for(int i=0;i<gas.length;i++){
  5. totalSUm+=(gas[i]-cost[i]);
  6. curSum+=(gas[i]-cost[i]);
  7. if(curSum<0){
  8. res=i+1;
  9. curSum=0;
  10. }
  11. }
  12. if(totalSUm<0){
  13. return -1;
  14. }else{
  15. return res;
  16. }

135. 分发糖果

  1. int[]dp=new int[ratings.length];
  2. Arrays.fill(dp,1);
  3. for(int i=1;i<dp.length;i++){
  4. if(ratings[i]>ratings[i-1]){
  5. dp[i]=dp[i-1]+1;
  6. }
  7. }
  8. for(int i=dp.length-2;i>=0;i--){
  9. if(ratings[i]>ratings[i+1]&&dp[i]<=dp[i+1]){
  10. dp[i]=dp[i+1]+1;
  11. }
  12. }
  13. int res=0;
  14. for (int i : dp) {
  15. res+=i;
  16. }
  17. return res;

860. 柠檬水找零

  1. int fiveCount=0;
  2. int tenCount=0;
  3. int twentyCount=0;
  4. for(int i=0;i<bills.length;i++){
  5. if(bills[i]==5){
  6. fiveCount++;
  7. }else if(bills[i]==10){
  8. if(fiveCount==0){
  9. return false;
  10. }else{
  11. fiveCount--;
  12. tenCount++;
  13. }
  14. }else{
  15. if(tenCount>=1&&fiveCount>=1){
  16. tenCount--;
  17. fiveCount--;
  18. twentyCount++;
  19. }else if(fiveCount>=3){
  20. fiveCount-=3;
  21. }else{
  22. return false;
  23. }
  24. }
  25. }
  26. return true;

406. 根据身高重建队列

  1. Arrays.sort(people, new Comparator<int[]>() {
  2. @Override
  3. public int compare(int[] o1, int[] o2) {
  4. if(o1[0]==o2[0]){
  5. return o1[1]-o2[1];
  6. }else{
  7. return o2[0]-o1[0];
  8. }
  9. }
  10. });
  11. LinkedList<int[]> res = new LinkedList<>();
  12. for (int[] person : people) {
  13. res.add(person[1],person);
  14. }
  15. return res.toArray(new int[res.size()][]);

452. 用最少数量的箭引爆气球

  1. Arrays.sort(points, new Comparator<int[]>() {
  2. @Override
  3. public int compare(int[] o1, int[] o2) {
  4. if(o1[0]<o2[0]){
  5. return -1;
  6. }else if(o1[0]>o2[0]){
  7. return 1;
  8. }else{
  9. return 0;
  10. }
  11. }
  12. });
  13. int res=1;
  14. for(int i=1;i<points.length;i++){
  15. if(points[i][0]<=points[i-1][1]){
  16. points[i][1]=Math.min(points[i][1],points[i-1][1]);
  17. }else{
  18. res++;
  19. }
  20. }
  21. return res;

435. 无重叠区间

  1. int res=0;
  2. Arrays.sort(intervals, new Comparator<int[]>() {
  3. @Override
  4. public int compare(int[] o1, int[] o2) {
  5. if(o1[1]<o2[1]){
  6. return -1;
  7. }else if(o1[1]>o2[1]){
  8. return 1;
  9. }else{
  10. return o1[0]-o2[0];
  11. }
  12. }
  13. });
  14. int last=intervals[0][1];
  15. for(int i=1;i<intervals.length;i++){
  16. if(intervals[i][0]<last){
  17. res++;
  18. }else{
  19. last=intervals[i][1];
  20. }
  21. }
  22. return res;

763. 划分字母区间

  1. char[] chars = s.toCharArray();
  2. int[]dp=new int[26];
  3. for(int i=0;i<chars.length;i++){
  4. dp[chars[i]-'a']=i;
  5. }
  6. List<Integer>res=new ArrayList<>();
  7. int max=Integer.MIN_VALUE;
  8. int last=-1;
  9. for(int i=0;i<chars.length;i++) {
  10. max = Math.max(max, dp[chars[i] - 'a']);
  11. if(i==max){
  12. res.add(i-last);
  13. last=i;
  14. }
  15. }
  16. return res;

56. 合并区间

  1. Deque<int[]>res=new LinkedList<>();
  2. Arrays.sort(intervals, new Comparator<int[]>() {
  3. @Override
  4. public int compare(int[] o1, int[] o2) {
  5. if(o1[0]==o2[0]){
  6. return o1[1]-o2[1];
  7. }else{
  8. return o1[0]-o2[0];
  9. }
  10. }
  11. });
  12. res.add(intervals[0]);
  13. for(int i=1;i<intervals.length;i++){
  14. if(intervals[i][0]<=intervals[i-1][1]){
  15. int[] ints = res.pollLast();
  16. ints[0]=Math.min(ints[0],intervals[i][0]);
  17. ints[1]=Math.max(ints[1],intervals[i][1]);
  18. res.addLast(ints);
  19. intervals[i]=ints;
  20. }else{
  21. res.addLast(intervals[i]);
  22. }
  23. }
  24. return res.toArray(new int[res.size()][]);

738. 单调递增的数字

  1. if(n%10==n){
  2. return n;
  3. }
  4. char[] chars = String.valueOf(n).toCharArray();
  5. for(int i=chars.length-2;i>=0;i--){
  6. if(chars[i]>chars[i+1]){
  7. chars[i+1]='9';
  8. chars[i]--;
  9. }
  10. }
  11. for(int i=1;i<chars.length;i++){
  12. if(chars[i]<chars[i-1]){
  13. chars[i]='9';
  14. }
  15. }
  16. String s=new String(chars);
  17. return Integer.parseInt(s);

968. 监控二叉树

  1. //1表示该节点安装摄像头,0表示当前节点没有被覆盖,2表示该节点被覆盖
  2. int monitor = monitor(root);
  3. if(monitor==0){
  4. res++;
  5. }
  6. return res;
  7. }
  8. private int monitor(TreeNode root){
  9. if(root==null){
  10. return -1;
  11. }
  12. int monitorLeft = monitor(root.left);
  13. int monitorRight = monitor(root.right);
  14. if(monitorLeft==0||monitorRight==0){
  15. res++;
  16. return 1;
  17. }else if(monitorLeft==1||monitorRight==1){
  18. return 2;
  19. }else{
  20. return 0;
  21. }
  22. }