7月算法训练------第四天(贪心)解题报告

7月算法训练------第四天(贪心)解题报告

题目类型:贪心
题目难度:简单

第一题、2078. 两栋颜色不同且距离最远的房子

题目链接:2078. 两栋颜色不同且距离最远的房子
思路分析:
遍历整个数组,如果两个数字不相同,且两者索引之差大于max,则更新max的值;
代码:

class Solution {
    public int maxDistance(int[] colors) {
        int max = 0;
        for(int i = 0; i < colors.length; i++){
            for(int j = i; j < colors.length; j++){
                if(colors[i] != colors[j]){
                    if(Math.abs(j -i) > max){
                        max = Math.abs(j - i);
                    }
                }
            }
        }
        return max;
    }
}

第二题、561. 数组拆分 I

题目链接:561. 数组拆分 I
思路分析:
我们通过例子发现,本题就是将数组排序后,从0开始,每隔两位相加
即:

a[0]a[1]a[2]a[3]a[4]a[5]
626512

排序后:

a[0]a[1]a[2]a[3]a[4]a[5]
122566

将表中红色的数字加起来就是要求的结果。
代码:

class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int sum = 0;
        for(int i = 0; i < nums.length; i+=2){
            sum += nums[i];
        }
        return sum;
    }
}

第三题、1323. 6 和 9 组成的最大数字

题目链接:1323. 6 和 9 组成的最大数字
思路分析:
我们将数字的每一位用数组n存起来,然后遍历每一位(用双层for),一次改变一位(将9置6,将6置9),然后算出当前的数字temp
如果该数字temp比原数字max大,则将最大值max更新;
最后返回最大的数字max
编程小细节:
在每次求完最大值后,应该将当前数字置零,否则,当前数字将越加越大,最终不是我们想要的答案。

代码:

class Solution {
    public int maximum69Number (int num) {
        int max = num;  //记录最大数字
        int temp = 0;  //记录改变某一位的数字
        int count = countNum(num);  //记录数字num的位数
        int[] n = new int[count];  //记录数字每一位的数组
        for(int i = 0; i < count; i++){  //数组赋值
            n[i] = num % 10;
            num /= 10;
        }
        for(int j = 0; j < count; j++){
            for(int i = 0; i < count; i++){
                if(i == j){  //控制每次只改变一位
                    if(n[i] == 6){
                        temp = temp + 9 * ciFang(i);
                    }else{
                        temp = temp + 6 * ciFang(i);
                    }
                }else{
                    temp = temp + n[i] * ciFang(i);
                }
            }
            if(temp > max){
                max = temp;
            }
            temp = 0;  //小细节:每次循环完,应将当前数字置0
        }
        return max;
    }
    /**
		求数字m的位数
	*/
    private static int countNum(int m){
        int count = 0;
        while(m != 0){
            if(m / 10 != 0){
                count++;
            }
            m /= 10; 
        }
        return count + 1;
    }
    /**
		求10的e次方
	*/
    private static int ciFang(int e){
        if(e == 0) return 1;
        int res = 1;
        for(int i = 0; i < e; i++){
            res = 10 * res;
        }
        return res;
    }
}

第四题、942. 增减字符串匹配

题目链接:942. 增减字符串匹配
思路分析:
以题目中例子为例:“IDID”
我们先将String转换为char数组c;

c[0]c[1]c[2]c[3]
IDID

定义两个指针lrl值为0,r值为s.length()
然后我们预先定义s.length()+1int数组seq
我们开始遍历char数组c
当我们读到字符数组中c[i]=="I"时,我们将当前l的值赋给seq[i],然后将l++
当我们读到字符数组中c[i]=="D"时,我们将当前r的值赋给seq[i],然后将r--
因为seq的长度比c1,所以seq的最后一个值在此时还没赋值,这时只需要将seq的最后一个值覆为lr的任意一个(因为此时l=r);
代码:

class Solution {
    public int[] diStringMatch(String s) {
        int l = 0, r = s.length();
        char[] c = s.toCharArray();
        int[] seq = new int[r + 1];
        for(int i = 0; i < seq.length - 1; i++){
            if(c[i] == 'I'){
                seq[i] = l;
                l++;
            }else{
                seq[i] = r;
                r--;
            }
        }
        seq[seq.length-1] = l;
        return seq;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值