算法练习第四天——贪心

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

思路:

1、n的范围不大,直接可以使用两个for循环解决;对于两个颜色不同的,取两者距离的最大值,足以后返回这个最大值

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

2、答案最大可能长度是n-1,即:首尾不同
如果不是n-1,那就是首尾相同,则最大可能长度就是n-2,即:尾-1和首不同 或者 首+1和尾不同
如果也不是n-2,那就是首尾和首+1和尾-1位置的数都相同,则最大可能长度就是n-3, 即首+2和尾不同 或者 尾-2和首不同

用两个指针 i 和 j 同时从两端向中间移动,每次各移动一步,当出现和首或者尾不同的数字的时候,最大可能长度就出现了:n-1-i 或者 j,n-i-1 == j ,最后直接返回 j

class Solution {
    public int maxDistance(int[] colors) {
      int n =colors.length;
      int i,j;
      for(i = 0,j = n-1;i<j;++i,--j){
          if(colors[i] != colors[n-1] || colors[j] != colors[0])
            break;
      }
      return j;
    }
}

561. 数组拆分 I

思路:将数组进行排序,然后间隔取,进行累加

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

1323. 6 和 9 组成的最大数字

思路:找到num中最高位的6,变为9,然后返回

class Solution {
    public int maximum69Number (int num) {
         char[]numchars=String.valueOf(num).toCharArray();
        for (int i = 0; i <numchars.length ; i++) {
            if(numchars[i]=='6'){
                numchars[i]='9';
                break;
            }
        }
        return Integer.valueOf(new String(numchars));
    }
}

942. 增减字符串匹配

思路:遇到 I就选剩余候选集的最小值,遇到 D就选剩余候选集的最大值。

class Solution {
    public int[] diStringMatch(String s) {
        int[] res = new int[s.length() + 1];
        int a = 0;
        int b = s.length();
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) == 'I') {
                res[i] = a;
                a ++;
            } else {
                res[i] = b;
                b --;
            }
        }
        res[s.length()] = a;
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值