刷题--二分法

Posted 2333wzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题--二分法相关的知识,希望对你有一定的参考价值。

最后一种二分法的可能情况:最终的答案是二分的。也就是说答案是处在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;
    }
}

 

以上是关于刷题--二分法的主要内容,如果未能解决你的问题,请参考以下文章

lintcode 刷题:457 经典二分查找问题

算法刷题范围建议 和 代码规范

算法刷题范围建议 和 代码规范

LeetCode面试刷题技巧-二分查找算法代码思路解析

蓝桥杯刷题笔记:二分查找

LeetCodeLCP 12. 小张刷题计划(二分查找)