每日一题

  1. 2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k,
    你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务,
    只不过,难度差距绝对值不超过k的任务,可以在一天之内都完成。
    返回完成所有任务的最少天数。
    来自微软。
public int minDay(int[] arr,int k){
        //预测  循环
        //预测  天数是小于arr.length
        //预测

        //任务数量
        int n = arr.length;
        //新建缓存数组
        int[] dp = new int[n];
        //定义第一个缓存默认值为1
        dp[0] =1;
        //循环这n个任务
        for (int i=1;i<n;i++){
            //计算接下来的缓存
            dp[i] = dp[i-1]+1;
            //制定一个最小值
            int min = arr[i];
            //制定一个最大值
            int max = arr[i];
            //循环这个下标到原点的数据
            for (int j= i-1;j>=0;j--){
                //重新找出这个距离里面的最小值
                min = Math.min(min,arr[j]);
                //重新找出这个距离里面的最大值
                max = Math.max(max,arr[j]);
                //预测 任务之间的难度差都是小于k的
                if (max-min<=k){
                   //重新定义这个缓存
                   dp[i] = Math.min(dp[i],1+(j-1>=0?dp[j-1]:0)); 
                }else {
                    //断开
                    break;
                }
            }
        }
        //返回这个缓存值的最后一个
        return dp[n-1];
    }

  1. 给定一个数组arr,给定一个正数M,
    如果arr[i] + arr[j]可以被M整除,并且i < j,那么(i,j)叫做一个M整除对。
    返回arr中M整除对的总数量。
    来自微软。
 public int num(int[] arr,int m){
        //数组的长度
        int n = arr.length;
        //定义返回值
        int ans =0;
        //开始循环
        for (int i=0;i<n;i++){
            //开始循环
            for (int j= i+1;j<n;j++){
                //预判
                if (Math.abs(arr[i]+arr[j])%m==0){
                    ans++;
                }
            }
        }
        return ans;
    }

posted @ 2022-05-21 14:12  一棵小萌新  阅读(66)  评论(0)    收藏  举报