zoukankan      html  css  js  c++  java
  • LeetCode:算法特辑——二分搜索

    LeetCode:算法特辑——二分搜索

    算法模板——基础

    int L =0;
    int R =arr.length;
    while(L<R)
    {
        int M = (R-L)/2+L;
        if(arr[M]<target)
            L=M+1;
        else if(arr[M]>target)
            R=M-1;
        else
            return M;
    }

    算法模板——返回排序数组中某值的上下边界

    图像描述

      

    算法描述

     public static  int  low_bound(int[] arr,int val){
            int l = 0;
            int r = arr.length;
            while (l<r)
            {
                int m = l+(r-l)/2;
                if(arr[m]>=val)
                    r=m;
                else
                    l=m+1;
            }
            return l;
        }
    
        public static  int  upper_bound(int[] arr,int val){
            int l = 0;
            int r = arr.length;
            while (l<r)
            {
                int m = l+(r-l)/2;
                if(arr[m]>val)
                    r=m;
                else
                    l=m+1;
            }
            return l;
        } 

    L-35 搜索插入位置

    题目描述

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

    示例 1:

    输入: [1,3,5,6], 5
    输出: 2
    

    示例 2:

    输入: [1,3,5,6], 2
    输出: 1
    

    示例 3:

    输入: [1,3,5,6], 7
    输出: 4
    

    示例 4:

    输入: [1,3,5,6], 0
    输出: 0

    算法描述

    class Solution {
        public int searchInsert(int[] nums, int target) {
            return upper_bound(nums,target);
        }
        
        public   int  upper_bound(int[] arr,int val){
            int l = 0;
            int r = arr.length;
            while (l<r)
            {
                int m = l+(r-l)/2;
                if(arr[m]>=val)
                    r=m;
                else
                    l=m+1;
            }
            return l;
        }
    }

    L-875 爱吃香蕉的珂珂

    题目描述

    珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

    珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。  

    珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

    返回她可以在 H 小时内吃掉所有香蕉的最小速度 KK 为整数)。

    示例 1:

    输入: piles = [3,6,7,11], H = 8
    输出: 4
    

    示例 2:

    输入: piles = [30,11,23,4,20], H = 5
    输出: 30
    

    示例 3:

    输入: piles = [30,11,23,4,20], H = 6
    输出: 23

    图像描述

      

    算法描述

    class Solution {
        public int minEatingSpeed(int[] piles, int H) {
            Arrays.sort(piles);
            int l  = 1;
            int r  = piles[piles.length-1]+1;
            while(l<r)
            {
                int m = (r-l)/2+l;
                int h = 0;
                for(int p:piles)
                    h+=(p+m-1)/m;
                if(h<=H)
                    r=m;
                else
                    l=m+1;
            }
            return l;
        }
    }
    

     

  • 相关阅读:
    常量/静态常量
    git github仓库
    内存泄漏/溢出
    console线和RJ45
    Medium
    教师群
    编程入门学习网站
    科技传播坊公众号
    科技传播坊直播课堂 Scratch
    Scratch 疑难杂症视频
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9537757.html
Copyright © 2011-2022 走看看