1891. Cutting Ribbons

这道题,要求cut ribbons,怎么cut都行,只要能cut出k条丝带就行,不是每条丝带都需要被cut,cut完没用的可以丢弃,求能cut出k条丝带的情况下,丝带的最大长度。你可以想象这样的场景,客户给你一堆丝带,让你帮忙cut出几条丝带,希望丝带越长越好,剩下的丝带就不要了。

暴力求解方法很简单,就是从数组里的最大数开始,每次减1,挨个试,作为被除数去除每个数,如果得到的商的总数等于k了,把数值返回即可, 如果都试到1了,还达不到k,就返回0.

我的暴力算法,时间复杂度O(n*m), n是数组里的最大数的数值,m是数组长度,会TLE:

   public int maxLength(int[] ribbons, int k) {
  
      Arrays.sort(ribbons);
       int max = ribbons[ribbons.length-1];
        for(int i=max;i>=1;i--){
            if(cutRibben(ribbons, i, k))
                return i;
        }
       return 0;
    }
    public boolean cutRibben(int[] ribbons, int length, int k) {
        int count = 0;
        for (int ribbon: ribbons) {
            count += (ribbon / length);
            if(count>=k)
                return true;
        } 
        return false;
    }

既然时间超时了,咱就得想想有没有时间复杂度好一点的算法,那么自然就想到了binary search, 时间复杂度是O(logn*m), n是数组里的最大数的数值, m是数组长度:

 

上一篇:正点原子嵌入式开发板Imx6ull mini使用体验——小白学ARM(十三)


下一篇:JUC辅助类CountDownLatch确保线程有序安全