当前位置: 首页 > news >正文

贪心算法 day08(加油站+单调递增的数字+坏了的计算机)

目录

1.加油站

2.单调递增的数字

3.坏了的计算器


1.加油站

链接:. - 力扣(LeetCode)

思路: 

gas[index] - cost[index],ret 表示的是在i位置开始循环时剩余的油量

a到达的最大路径假设是f那么我们可以得出 a + b + c + d + e +f < 0  那么从b开始的话到达f那也是小于0的无法循环(b是正数 即只能从正的位置开始循环)

代码:

    public static int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length,step = 0;
        for (int i = 0; i < n; i++) {
            int ret = 0;
            for( step = 0; step < n;step++){
                int index = (step + i) % n;
                ret = ret + gas[index] - cost[index];
                if(ret < 0){
                    break;
                }
            }

            if(ret >= 0){
                return i ;
            }
//更新i要满足两个条件,首先是要step循环要结束,
//同时要判断i坐标下的ret小于0,即该位置下的最大step 
//同时如果 ret = 0时就需要再更新i坐标
            i = i +step;
        }
        return -1;
    }

2.单调递增的数字

链接:. - 力扣(LeetCode)

 思路:

代码:

class Solution {
       public int monotoneIncreasingDigits(int n) {
        char[] ch = Integer.toString(n).toCharArray();
        int l = ch.length,i = 0;
       while(i + 1 < l && ch[i] <= ch[i + 1]) i++;
       //第一种情况 数组都是单调递增的 i恰好是在l - 1的位置
        if(i == l - 1){
            return n;
        }
        //  如果出现连续数字都是相同的情况我们需要把相同的第一个数字减一其他的变为9就好
        while( i - 1 >= 0 && ch[i] == ch[i - 1])i--;
        ch[i] --;
        for(int j = i +1 ; j < l;j++){
            ch[j] = '9';
        }
        return Integer.parseInt(new String(ch));

    }
}

3.坏了的计算器

题目链接:991. 坏了的计算器 - 力扣(LeetCode)

题目给出的处理方式为-1和 *2 ,这里我们采用逆放思想此时的处理方式只有+1 和 /2,分两种情况讨论。

一种是 startValue >= target ,此时逆放推理由target变到startValue,要想增加只能+1.

例如 :startValue = 10 ,target = 4 ,target为偶数除以2只会离startValue越来越小,所以不管奇偶只要+1就好,处理次数为 startValue - target。

第二种 startValue < target ,此时逆反推理偶数先除2更优。target除2之后变小离startValue更近。

证明:x,k为偶数    x如果执行先+1操作 假设+k次之后再进行除2操作(最终必须除2因为 target 大于 startValue要变小)就需要执行(k+1)次操作变成(x+k)/2;

   如果x先除2未达到startValue之后再进行+1操作 ,只需加k/2次,操作次数为(k/2+1);

假设:startValue = 3 ,target = 10,由target推理startValue,偶数target先除2变奇数+1target > startValue前提下 再除2。

代码:

class Solution {
      public static int brokenCalc(int startValue, int target) {
        int count = 0;
        while (target > startValue){
            if( target% 2 == 0) target /= 2;
            else target += 1;
            count++;
        }
        return count+ startValue - target;
    }
}

相关文章:

  • 电视剧角色扮演AI Agent中的大模型操作流程
  • 【Java设计模式】第4章 简单工厂讲解
  • Oracle DROP、TRUNCATE 和 DELETE 原理
  • SpringBoot实现随机生成10位数字和字母组合
  • Maven学习总结(61)—— Maven 依赖冲突检测及其解决方案
  • HTML5+CSS3小实例:纯CSS绘制七巧板
  • Deepseek解锁科研绘图新方式
  • MCU的USB接口作为 USB CDC串口输出
  • 猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
  • 【browser-use+deepseek】实现简单的web-ui自动化
  • 城电科技 | 探索光伏景观廊道:适用于零碳园区/公园/景区/校园/乡村长廊建设
  • MySQL NULL 值处理
  • Linux服务器安装百度飞桨3.0(pip docker)
  • OpenCV 物体追踪
  • 软件测试笔记(上)
  • 汉化进度100%
  • 高效解读机器语言,profinet转ethernet ip网关烟草企业自动化升级案例分析
  • Java设计模式全解析(共 23 种)
  • Redis与Lua原子操作深度解析及案例分析
  • 程序持续内存泄漏问题定位参考
  • wdcp 网站迁移/百度网页游戏大厅
  • 无锡建设网站的公司哪家好/国际新闻最新消息今天军事新闻
  • 网站建设的创新之处/关键词免费
  • 企业信息公开网查询系统/张掖seo
  • 网站死链接怎么提交/如何注册网站怎么注册
  • 如何查看网站在哪里做的/app联盟推广平台