贪心练习之点灯问题

题目描述

给一个字符串,字符串中只有.和X两种字符,X表示墙,点表示空地,现在,需要在空地点灯,一盏灯能点亮周围三格的位置,请你求出把所有空地点亮,最少需要几盏灯?

思路分析

观察题目要求,我的思路是,统计有多少个连续的点,然后除3向上取整,因为最多三格嘛,比如4个连续点,就需要两盏灯,这种思路比较容易想到,代码如下:

    public static int f2(String str){
        if(str.length()==0||str==null){
            return 0;
        }
        char[] chars=str.toCharArray();
        int res=0;
        int num=0;
        for (int i = 0; i < chars.length; i++) {
            if(chars[i]=='X'){
                if (num!=0){
                    if(num%3!=0){
                        res+=num/3+1;
                    }else {
                        res+=num/3;
                    }
                    num=0;
                }
            }else {
                num++;
            }
        }
        res+=Math.ceil(num/3);
        return res;
    }

第二种,就是贪心思想了,观察题目要求,我们可以考虑,如何不用关心前面的结果,只与后面的有关呢?如果当前是一个X,那么继续看下一个。如果当前是点,则我们看下一个位置是什么?如果也是点,则灯的位置应该就是在第二个位置,这就是我们的贪心策略,选择靠后的位置放灯,此时,当我们把第二个位置放灯后,我们根本就不用考虑第三个位置了,因为第三个位置无论是什么,都已经涵盖在灯的范围内了,此时直接跳到第四个位置重新判断。 同时,当第二个位置不是点时,说明只能在第一个位置放灯,此时,直接跳到第三个位置判断。

代码:

    public static int f1(String str){
        if(str.length()==0||str==null){
            return 0;
        }
        char[] chars=str.toCharArray();
        int res=0;

        for (int i = 0; i < chars.length;) {
            if(chars[i]=='X'){
                i++;
            }else {
                res++;
                if(chars[i+1]=='X'){
                    i=i+2;
                }else{
                    i=i+3;
                }
            }
        }
        return res;
    }

你可能感兴趣的:(算法学习,贪心算法,算法,数据结构,java)