首页 > 其他分享 >day33

day33

时间:2023-02-17 00:11:06浏览次数:30  
标签:ratings nums int day33 candys 排序 糖果

1、leetcode1005 K次去饭后最大化的数组和

  1. 思路

    • 局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。
  2. 代码

    1. class Solution {
          //共使用两次排序
          public int largestSumAfterKNegations(int[] nums, int k) {
              Arrays.sort(nums);//第一次排序
      
              for(int i=0; i<nums.length; i++) {
                  if(nums[i]<0 && k>0) {
                      nums[i] *= -1;
                      k--;
                  }
              }
      
              Arrays.sort(nums);//第二次排序
              if( k % 2 == 1) {
                  nums[0] *= -1;
              }
      
              int sum = 0;
              for(int num : nums) {
                  sum += num;
              }
      
              return sum;
          }
      }
      
    2. 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小【可减少一次排序】

      class Solution {
          public int largestSumAfterKNegations(int[] nums, int K) {
          	// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
              nums = IntStream.of(nums)
                       .boxed()
                       .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
                       .mapToInt(Integer::intValue).toArray();
              
              int len = nums.length;	    
              for (int i = 0; i < len; i++) {
                  //从前向后遍历,遇到负数将其变为正数,同时K--
                  if (nums[i] < 0 && K > 0) {
                      nums[i] = -nums[i];
                      K--;
                  }
              }
      
              // 如果K还大于0,那么反复转变数值最小的元素,将K用完
              if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
      
              return Arrays.stream(nums).sum();
      
          }
      }
      

2、leetcode134 加油站

  1. 思路

    • 如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。
    • 每个加油站的剩余量rest[i]为gas[i] - cost[i]。
    • i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
  2. 代码

    class Solution {
        public int canCompleteCircuit(int[] gas, int[] cost) {
            int curSum = 0;
            int totalSum = 0;
            int startIndex = 0;
    
            for(int i=0; i<gas.length; i++) {
                curSum += gas[i] - cost[i];
                totalSum += gas[i] - cost[i];
                if(curSum < 0) {
                    startIndex = (i+1) % gas.length;
                    curSum = 0;
                }
            }
    
            if(totalSum < 0) {
                return -1;
            }
            return startIndex;
            
        }
    }
    

3、leetcode135 分发糖果

  1. 思路

    1. 先确定右边评分大于左边的情况(也就是从前向后遍历)
      • 此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果
    2. 再确定左孩子大于右孩子的情况(从后向前遍历)
      • 局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。
  2. 代码

    class Solution {
        public int candy(int[] ratings) {
            int[] candys = new int[ratings.length];
            candys[0] = 1;
    		
            //从前向后
            for(int i=1; i<candys.length; i++) {
                candys[i] = (ratings[i] > ratings[i - 1]) ? candys[i - 1] + 1 : 1;
            }
    		
            //从后向前
            for(int i=candys.length-2; i>=0; i--) {
                if(ratings[i] > ratings[i+1]) {
                    candys[i] = Math.max(candys[i], candys[i+1] + 1);
                }
            }
    
            int candyNums = 0;
            for(int i=0; i<candys.length; i++) {
                candyNums += candys[i];
            }
    
            return candyNums;
        }
    }
    

标签:ratings,nums,int,day33,candys,排序,糖果
From: https://www.cnblogs.com/hzj-bolg/p/17128737.html

相关文章

  • LeetCode刷题记录.Day33
    对称二叉树迭代法classSolution{public:boolisSymmetric(TreeNode*root){if(root==NULL)returntrue;queue<TreeNode*>qu......
  • day33
    【0257.二叉树的所有路径】我的迭代法运行不成功/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • Day33:String类及其常用方法详解
    String类1.1String类概述Java中字符串属于对象,String类用于创建和操作字符串。最简单的字符串创建:直接通过String创建Stringstr="工地佬";利用String构造器创建字......
  • day33-JSON&Ajax01
    JSON&Ajax01JSON在线文档AJAX在线文档1.JSON介绍JSON指的是JavaScript对象表示法(JavaScriptObjectNotation),JSON的本质仍然是JavaScript对象JSON是轻量......
  • 代码随想录Day33
    LeetCode530.二叉搜索树的最小绝对差给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有2个节点。思路:由于是......
  • day33- js基础语法
    字符串正常字符串使用单双引号包裹转义字符\'\n\t\u4e2d(\u####)unicode字符Ascll字符多行字符串``tab键上面的``包含多行字符模板字符串需要使......
  • 进入python的世界_day33_网络编程—— 黏包现象、UDP协议、并发编程理论
    一、黏包现象1.何为黏包​ 流逝协议:所有的数据类似于水流连接在一起的​ 数据量很小并且时间间隔很多那么就会自动组织到一起recv​ 我们不知道即将要接收的......
  • day33 过滤器filter & 监听器listener & 利用反射创建BaseServlet实现调用自定义业务
    Filter过滤器Fileter可以实现:1)客户端的请求访问servlet之前拦截这些请求,对用户请求进行预处理2)对HttpServletResponse进行后处理;注意多个Filter的执行顺序在web.xml配......
  • day33
    html样式1.样式分为内联样式和外联样式: 内联样式:样式代码直接写在当前html页面中 外联样式:样式写在XXX.css文件中,并且在需要的页面中,使用Link标签引入2.样式:样......
  • day33
    流流根据方向的不同,可以分为输入和输出流(I/O流)输入流:用来读取数据的输出流:用来写出数据的流又可以分为低级流(字节流)和高级流(处理流或者过滤流)注意:高级流是......