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

贪心算法--给定一个只包含X和.字符串

给定一个字符串str, 只有 ‘X’和’.'两种字符构成。
'X’表示墙,不能放灯,也不需要点亮。
'.'表示居民点,可以放灯,需要点亮。
如果灯放在i位置,可以让 i-1,和i和i+1三个位置被点亮.
返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。

import java.util.HashSet;

public class Light {

    public static int minLight1(String road) {
        if (road == null || road.length() == 0) {
            return 0;
        }
        return process(road, 0, new HashSet<>());
    }

    public static int process(String road, int i,  HashSet<Integer> lights){
        if(i == road.length()){
            for (int j = 0; j < road.length(); j++) {
                if(road.charAt(j) != 'X'){
                    if(!lights.contains(j-1) && !lights.contains(j) && !lights.contains(j+1)){
                        return Integer.MAX_VALUE;
                    }
                }
            }
            return lights.size();
        }else {
            int y = Integer.MAX_VALUE;
            //int n = Integer.MAX_VALUE;
            if(road.charAt(i) != 'X') {
                lights.add(i);
                y = process(road, i + 1, lights);
                lights.remove(i);
            }
            int n = process(road, i + 1, lights);
            return Math.min(y, n);
        }
    }

    public static int minLight2(String road) {
        if(road == null || road.length() == 0){
            return 0;
        }

        int light = 0;
        int i = 0;
        int len = road.length();
        while (i < len){
            if(road.charAt(i) == 'X'){
                i++;
            }else{
                light++;
                if(i+1 == len){
                    break;
                }else if(road.charAt(i+1) == 'X'){
                    i = i + 2;
                }else{
                    i = i + 3;
                }
            }
        }
        return light;
    }

    public static int minLight3(String road) {
        char[] str = road.toCharArray();
        int cur = 0;
        int light = 0;
        for (char c : str) {
            if (c == 'X') {
                light += (cur + 2) / 3;
                cur = 0;
            } else {
                cur++;
            }
        }
        light += (cur + 2) / 3;
        return light;
    }

    // for test
    public static String randomString(int len) {
        char[] res = new char[(int) (Math.random() * len) + 1];
        for (int i = 0; i < res.length; i++) {
            res[i] = Math.random() < 0.5 ? 'X' : '.';
        }
        return String.valueOf(res);
    }

    public static void main(String[] args) {
        int len = 20;
        int testTime = 100000;
        for (int i = 0; i < testTime; i++) {
            String test = randomString(len);
            int ans1 = minLight1(test);
            int ans2 = minLight2(test);
            int ans3 = minLight3(test);
            if (ans1 != ans2 || ans2 != ans3) {
                System.out.println("oops!");
            }
        }
        System.out.println("finish!");
    }
}
http://www.dtcms.com/a/49937.html

相关文章:

  • mysql表的约束
  • springboot可以同时处理多少个请求
  • 2503,D比C更易重构
  • 将md格式转jupyter并运行
  • Redis 实现延迟队列的方案
  • 【STM32项目实战系列】基于STM32G474的FDCAN驱动配置
  • 动态规划_路径问题(典型算法思想)—— OJ例题算法解析思路
  • C++20 中位移位运算符的统一行为:深入解析与实践指南
  • 紧跟 Web3 热潮,RuleOS 如何成为行业新宠?
  • 月结保障:回滚慢、行锁频发
  • UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持
  • OpenCV计算摄影学(13)实现 Reinhard 全局色调映射算法的类cv::TonemapReinhard
  • 基于Arcgis的python脚本实现相邻矢量面的高度字段取平均值
  • 力扣-动态规划-583 两个字符的删除操作
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(0)系统设计与工具链说明
  • QT 作业 day4
  • 浅谈开发环境
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 前端开发好用的AI工具介绍
  • AI 芯片全解析:定义、市场趋势与主流芯片对比
  • Stable Diffusion Prompt编写规范详解
  • 测试工程师的DeepSeek提效2:自动化测试应用
  • 科普篇之Java堆内缓存优化-IntegerCache的使用
  • 边缘计算概念、厂商介绍及产业分析
  • 软件架构设计7大原则
  • 面试八股文--数据库基础知识总结(3)MySQL优化
  • 使用Windbg分析dump文件定位软件异常的方法与操作步骤
  • pandas如何在指定位置添加一个dataframe
  • 力扣hot100刷题——栈
  • 【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析