刷题--二分法(4)

时间:2020-02-01 00:23:21   收藏:0   阅读:88

最后一种二分法的可能情况:最终的答案是二分的。也就是说答案是处在sort array中的,需要每次验证一下mid对应的值是偏大还是偏小。

例  lintcode 183. Wood Cut   https://www.lintcode.com/problem/wood-cut/description

从考虑答案的角度,切割长度从1开始增加,长度为1的时候可能切出几百根,为2时几百根,随着长度增加,能切出的根数逐渐减小,直到到达最小的 大于等于k 的根数,即找对应根数大于等于k的最后一个位置,所以相等的时候可以直接返回,也可以left = mid区间向右缩进。

public class Solution {
    /**
     * @param L: Given n pieces of wood with length L[i]
     * @param k: An integer
     * @return: The maximum length of the small pieces
     */
    public int woodCut(int[] L, int k) {
        int left = 1, right = findLongest(L);
        
        while(left + 1 < right){
            int mid = (left + right) >>> 1;
            if(numOfPices(L, mid) < k)
                right = mid;
            else
                left = mid;
        }
        
        if(numOfPices(L, right) >= k)
            return right;
        if(numOfPices(L, left) >= k)
            return left;
        return 0;
    }
    
    public int numOfPices(int[] L, int len){
        int num = 0;
        
        for(int i = 0;i < L.length;i++){
            num += L[i]/len;
        }
        
        return num;
    }
    
    public int findLongest(int[] L){
        int max = 0;
        for(int i = 0; i < L.length;i++){
            if(L[i] > max) 
                max = L[i]; 
        }
        
        return max;
    }
}

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!