一、(leetcode 410)分割数组的最大值
题目描述:
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
代码如下:

class Solution {public:int splitArray(vector<int>& nums, int m) {long left=nums[0],right=0;for(auto i:nums){right+=i;left=left>i?left:i;}while(right>left){long mid=left+(right-left)/2;long temp=0;int cnt=1;for(auto i:nums){temp+=i;if(temp>mid){temp=i;cnt++;}}if(cnt>m){left=mid+1;}else{right=mid;}}return left;}
};

二、(LeetCode 875)爱吃香蕉的珂珂
题目描述:
珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

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

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

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

代码如下:

class Solution {public:int minEatingSpeed(vector<int>& piles, int H) {int left=1;//最小每小时吃一根int right=0;//最大每小时吃数组中的最大值for(int num:piles){right=max(right,num);}while(left<right){int mid=left+(right-left)/2;int cnt=0;for(int num:piles){if(num%mid==0){cnt+=num/mid;}else{cnt+=num/mid+1;}}if(cnt>H){left=mid+1;}else{right=mid;}}return left;}
};

三、(LeetCode 1011)在D天内送达包裹的能力
题目描述:
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。

代码如下:

class Solution {public:int shipWithinDays(vector<int>& weights, int D) {int left=0;int right=0;for(int num:weights){left=max(left,num);right+=num;}while(left<right){int mid=left+(right-left)/2;int temp=0;int cnt=0;for(int num:weights){if(temp+num>mid){cnt++;temp=0;}temp+=num;}cnt++;if(cnt>D){left=mid+1;}else{right=mid;}}return left;}
};

四、(LeetCode 1482)制作m束花所需的最少天数
题目描述:
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

代码如下:

class Solution {public:int minDays(vector<int>& bloomDay, int m, int k) {if(m*k>bloomDay.size()) return -1;int left=0;int right=0;for(int num:bloomDay){right=max(right,num);}while(left<right){int mid=left+(right-left)/2;int cnt=count(bloomDay,mid,k);if(cnt<m){left=mid+1;}else{right=mid;}}return left;}int count(vector<int>nums,int day,int k){int res=0;int temp=0;for(int num:nums){if(num<=day){temp++;}else{temp=0;}if(temp==k){res++;temp=0;}}return res;}
};

五、(LeetCode 1552)两球之间的磁力
题目描述:
在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。

已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。

给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。

代码如下:

class Solution {public:int count(vector<int>position,int mid){int cnt=1;int pre=position[0];for(int i=1;i<position.size();i++){if(position[i]-pre>mid){cnt++;pre=position[i];}}return cnt;}int maxDistance(vector<int>& position, int m) {sort(position.begin(),position.end());int left=INT_MAX;for(int i=1;i<position.size();i++){left=min(left,position[i]-position[i-1]);}int right=position.back()-position[0];while(left<right){int mid=left+(right-left)/2;if(count(position,mid)>=m){left=mid+1;}else{right=mid;}}return left;}
};

六、(LeetCode 1631) 最小体力消耗路径
题目描述:
你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。

一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。

请你返回从左上角走到右下角的最小 体力消耗值 。

思路:
只用dfs,会超时

因此用二分法+dfs

代码如下:
超时代码如下:

class Solution {int res=INT_MAX;int row=0;int col=0;vector<vector<int>>dir={{1,0},{0,1},{-1,0},{0,-1}};
public:int minimumEffortPath(vector<vector<int>>& heights) {row=heights.size();col=heights[0].size();vector<vector<bool>> visited(row,vector<bool>(col,false));visited[0][0]=true;dfs(heights,0,0,INT_MIN,visited);return res;}void dfs(vector<vector<int>>& heights,int x,int y,int m,vector<vector<bool>>& visited){if(x==row-1&&y==col-1){res=min(res,m);return;}for(int k=0;k<dir.size();k++){int i=x+dir[k][0];int j=y+dir[k][1];if(i>=0&&i<row&&j>=0&&j<col&&!visited[i][j]){int n=max(m,abs(heights[i][j]-heights[x][y]));visited[i][j]=true;dfs(heights,i,j,n,visited);visited[i][j]=false;}}}
};

二分法+dfs代码如下:

class Solution {int row=0;int col=0;vector<vector<int>>dir={{1,0},{0,1},{-1,0},{0,-1}};
public:int minimumEffortPath(vector<vector<int>>& heights) {row=heights.size();col=heights[0].size();int left=0,right=1e6,mid;while(left<right){mid=left+(right-left)/2;vector<vector<bool>> visited(row,vector<bool>(col,false));if(dfs(heights,0,0,mid,visited)){right=mid;}else{left=mid+1;}}return left;}bool dfs(vector<vector<int>>& heights,int x,int y,int m,vector<vector<bool>>& visited){if(x==row-1&&y==col-1){return true;}visited[x][y]=true;for(int k=0;k<dir.size();k++){int i=x+dir[k][0];int j=y+dir[k][1];if(i>=0&&i<row&&j>=0&&j<col&&!visited[i][j]&&abs(heights[i][j]-heights[x][y])<=m){if(dfs(heights,i,j,m,visited)){return true;}}}return false;}
};

leetcode 二分法 最大值最小化/最小值最大化相关推荐

  1. 在程序中设置最小化、最大化、关闭按钮

        下面程序ControlBoxTest演示了最小化.最大化.关闭按钮的设置方法及效果. (1)打开VS2008,新建一个Windows窗体应用程序,并命名为ControlBoxTest. (2) ...

  2. C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现

    本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: ? 1 2 3 4 5 ...

  3. Monthly Expense POJ - 3273(二分最大值最小化)

    Farmer John is an astounding accounting wizard and has realized he might run out of money to run the ...

  4. UG\NX二次开发 获取UG窗口句柄。实现操作UG窗口最小化、最大化、关闭功能

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取UG窗口句柄.实现操作UG窗口最小化.最大化.关闭功能 代码: int doWo ...

  5. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  6. linux系统浏览器最小化,调整Firefox火狐浏览器的最小化、最大化、关闭按钮键大小...

    在Deepin Linux系统中的Firefox火狐浏览器三大按钮有些小,即最小化.最大化.关闭按钮键小,除了修改主题外,还可以自行修改用户css文件,其实Firefox火狐是支持用户通过css文件对 ...

  7. Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小

    文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...

  8. 监听浏览器最小化与最大化时,执行的动作。

    本周做项目时,实现页面内容滚动的一个功能时, 发现在chrome与FF浏览器最小化后,当再次最大化时,滚动出现错位的现象.鉴于此,就去查了下http://html5test.com/ 中是否有相关的支 ...

  9. C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现

    很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江.目前新工作也处于熟悉当中,希望大家能体 ...

最新文章

  1. php学习_第6章_PHP的语言结构
  2. java自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇(详细教程)
  3. Play! Framework 系列(二):play 的项目结构
  4. citrix POC环境准备
  5. N多校2018d4t7Maximum Mode
  6. 2008R2Win7管理八DNS新功能及常规管理
  7. 6位行政区划代码与4位银行地区代码对应表
  8. 斗鱼直播实时数据爬取
  9. 浅谈两点分布,二项分布,伽马分布,指数分布,泊松分布,卡方分布,t分布,F分布,均匀分布,正态分布,β分布,狄利克雷分布--概率分布家族的伦理关系
  10. QLCDNumber制作的超简单计时器,按下空格键暂停。
  11. (亲测n次)极其简单的ubuntu,Windows iso 安装方式(双系统或者单系统)
  12. 代码:matlab求QR分解,QL分解,LQ分解和RQ分解。
  13. OUC2022秋软件工程第14小组作业
  14. java+selenium自动化抓取51la数据
  15. 【mysql优化实战】第一章 建表
  16. 什么是百度快照?百度快照分析及SEO优化基础工作
  17. 数据湖:流计算处理框架Flink概述
  18. 学会结构化思维,成为大牛唾手可得
  19. errdisabled 障碍处理
  20. Mac通过MAMP集成安装连接MySQL

热门文章

  1. Codeforces Round #533(Div. 2) A.Salem and Sticks
  2. [UOJ] #261 天天爱跑步
  3. c++的内存管理(raii->shart_ptr->垃圾回收)
  4. 记忆法——《认知天性》
  5. 小白题解 Codeforces 794B Cutting Carrot
  6. C语言实现房贷计算器
  7. Keepalived+LVS+MariaDB Galera Cluster10.0高可用负载均衡多主复制
  8. 电路设计学习一:DAC/ADC原理
  9. java ssi_快速部署SSI框架
  10. QuickIndex 通讯录快速检索