二分难题 && deque
141. Sqrt(x)
https://www.lintcode.com/problem/sqrtx/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param x: An integer
* @return: The sqrt of x
*/
public int sqrt(int x) {
// write your code here
if(x==0){
return 0;
}
long start =1;
long end = x;
while(start+1<end){
long mid = start+(end-start)/2;
if(mid*mid<x){
start = mid;
}else{
end = mid;
}
}
if(end*end<=x){
return (int)end;
}
return (int)start;
}
}
586. Sqrt(x) II
https://www.lintcode.com/problem/sqrtx-ii/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param x: a double
* @return: the square root of x
*/
public double sqrt(double x) {
// write your code here
double start =0;
//如果x<1,那么右边界=1
double end = Math.max(1,x);
double diff = 1e-12;
while(start+diff<end){
double mid = start +(end-start)/2;
if(mid*mid<x){
start = mid;
}else{
end = mid;
}
}
return start;
}
}
390. Find Peak Element II
https://www.lintcode.com/problem/find-peak-element-ii/description?_from=ladder&&fromId=4
public class Solution {
/*
* @param A: An integer matrix
* @return: The index of the peak
*/
public List<Integer> findPeakII(int[][] A) {
// write your code here
if(A==null|| A.length==0|| A[0].length==0){
return new ArrayList<>();
}
int r = A.length;
int c = A[0].length;
int low =1;
int high = r-2;
List<Integer> ans = new ArrayList<>();
while(low<=high){
int mid = low +(high-low)/2;
int col = maxForEachRow(mid,A);
if(A[mid][col]<A[mid-1][col]){
high = mid-1;
}else if(A[mid][col]<A[mid+1][col]){
low = mid+1;
}else{
ans.add(mid);
ans.add(col);
break;
}
}
return ans;
}
private int maxForEachRow(int row,int[][] A){
int col = 0;
int max = A[row][0];
for(int i=0;i<A[row].length;i++){
if(A[row][i]>max){
max = A[row][i];
col = i;
}
}
return col;
}
}
183. Wood Cut
https://www.lintcode.com/problem/wood-cut/description?_from=ladder&&fromId=4
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) {
// write your code here
if(L==null ||L.length ==0){
return 0;
}
int l =0;
int r =0;
for(int len:L){
r= Math.max(r,len);
}
while(l+1<r){
int mid = l+ (r-l)/2;
if(count(mid,L)>=k){
l = mid;
}else{
r = mid;
}
}
if(count(r,L)>=k){
return r;
}
return l;
}
public int count(int len,int[] L){
int sum =0;
for(int wood:L){
sum+=wood/len;
}
return sum;
}
}
437. Copy Books
https://www.lintcode.com/problem/copy-books/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param pages: an array of integers
* @param k: An integer
* @return: an integer
*/
public int copyBooks(int[] pages, int k) {
// write your code here
if(pages==null || pages.length==0){
return 0;
}
int start = getMaxPages(pages);
int end = getTotalPages(pages);
while(start+1<end){
int mid = start + (end-start)/2;
if(countPeople(pages,mid)<=k){
end = mid;
}else{
start = mid;
}
}
if(countPeople(pages,start)<=k){
return start;
}
return end;
}
public int getTotalPages(int[]pages){
int sum =0;
for(int i =0;i<pages.length;i++){
sum+=pages[i];
}
return sum;
}
public int getMaxPages(int[] pages){
int max =0;
for(int i=0;i<pages.length;i++){
max = Math.max(max,pages[i]);
}
return max;
}
public int countPeople(int[] pages,int min){
int count =0;
int sum = 0;
for(int i =0;i<pages.length;i++){
if(sum+pages[i]>min){
count++;
sum = pages[i];
}else{
sum+=pages[i];
}
}
if(sum>0){
count++;
}
return count;
}
}
438. Copy Books II
https://www.lintcode.com/problem/copy-books-ii/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param n: An integer
* @param times: an array of integers
* @return: an integer
*/
public int copyBooksII(int n, int[] times) {
// write your code here
if(times==null || times.length==0){
return 0;
}
int start = getMin(times);
int end = start*n;
while(start+1<end){
int mid = start +(end-start)/2;
if(canCopy(times,n,mid)){
end = mid;
}else{
start = mid;
}
}
if(canCopy(times,n,start)){
return start;
}
return end;
}
public int getMin(int[] times){
int min = Integer.MAX_VALUE;
for(int t:times){
min = Math.min(t,min);
}
return min;
}
public boolean canCopy(int[] times,int n,int time){
int sum = 0;
for(int t:times){
sum += time/t;
}
return sum>=n;
}
}
414. Divide Two Integers
https://www.lintcode.com/problem/divide-two-integers/description?_from=ladder&&fromId=4
1. 基本思想是不断地减掉除数,直到为0为止。但是这样会太慢。
2. 我们可以使用2分法来加速这个过程。不断对除数*2,直到它比被除数还大为止。加倍的同时,也记录下cnt,将被除数减掉加倍后的值,并且结果+cnt。
因为是2倍地加大,所以速度会很快,指数级的速度。
3. 另外要注意的是:最小值的越界问题。对最小的正数取abs,得到的还是它。。。 因为最小的正数的绝对值大于最大的正数(INT)
所以,我们使用Long来接住这个集合就可以了。
public class Solution {
/**
* @param dividend: the dividend
* @param divisor: the divisor
* @return: the result
*/
public int divide(int dividend, int divisor) {
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
long ret =0;
// 这里必须是= 因为相等时也可以减
while(a>=b){
for(long deduce = b,cnt=1;deduce<=a;deduce<<=1,cnt<<=1){
a = a-deduce;
ret+=cnt;
}
}
// 获取符号位。根据除数跟被除数的关系来定
// bug 4: out of range:
/*
Input: -2147483648, -1
Output: -2147483648
Expected: 2147483647
*/
ret = ((dividend > 0) ^ (divisor > 0)) ? -ret: ret;
//另一种写法
//ret = ((((dividend ^ divisor) >> 31) & 1) == 1) ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
} else {
return (int)ret;
}
}
}
617. Maximum Average Subarray II
https://www.lintcode.com/problem/maximum-average-subarray-ii/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param nums: an array with positive and negative numbers
* @param k: an integer
* @return: the maximum average
*/
public double maxAverage(int[] nums, int k) {
// write your code here
if(nums==null || nums.length ==0){
return 0d;
}
double end =Double.MIN_VALUE;
double start = Double.MAX_VALUE;
for(int num:nums){
end = Math.max(end,num);
start = Math.min(start,num);
}
double diff = 1e-6;
while(start+diff<end){
double mid = start + (end-start)/2;
if(hasAverage(nums,k,mid)){
start = mid;
}else{
end = mid;
}
}
if(hasAverage(nums,k,end)){
return end;
}
return start;
}
public boolean hasAverage(int[] nums, int k,double aver){
double preMin =0;
double preSum =0;
double sum =0;
for(int i=0;i<k;i++){
sum+=nums[i]-aver;
}
if(sum>=0){
return true;
}
for(int i=k;i<nums.length;i++){
preSum += nums[i-k]-aver;
preMin= Math.min(preSum,preMin);
sum+= nums[i]-aver;
if(sum-preMin>=0){
return true;
}
}
return false;
}
}
633. Find the Duplicate Number
思路:设定重复的数字为x,那么x的特征是数组中比x小的个数>x, 而对于比x小的数y,应该是比y小的个数<=y
https://www.lintcode.com/problem/find-the-duplicate-number/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param nums: an array containing n + 1 integers which is between 1 and n
* @return: the duplicate one
*/
public int findDuplicate(int[] nums) {
// write your code here
int l = 1;
int r = nums.length-1;
while(l+1<r){
int mid = l +(r-l)/2;
if(count(nums,mid)<=mid){
l = mid;
}else{
r = mid;
}
}
if(count(nums,l)>l){return l;}
return r;
}
//<=mid的数字个数
private int count(int[] nums,int mid){
int cnt =0;
for(int item:nums){
if(item<=mid){
cnt++;
}
}
return cnt;
}
}
362. Sliding Window Maximum
思路:1.插入时,如果发现尾部<插入值,那么尾部无需保留,poll出去,这样会保留一个递减序列
2.最大值即为头部,没加入一个最大值,如果发现该值坐标为窗口第一个值,即下次滑动将不在窗口中,那么poll掉
3.用双端队列实现
https://www.lintcode.com/problem/sliding-window-maximum/description?_from=ladder&&fromId=4
public class Solution {
/**
* @param nums: A list of integers.
* @param k: An integer
* @return: The maximum number inside the window at each moving.
*/
public List<Integer> maxSlidingWindow(int[] nums, int k) {
// write your code here
List<Integer> res = new ArrayList<>();
if(nums==null || nums.length<k){
return res;
}
//queue中记录下标
Deque<Integer> queue = new LinkedList<>();
for(int i=0;i<nums.length;i++){
while(!queue.isEmpty() && nums[i]>nums[queue.peekLast()]){
queue.pollLast();
}
queue.offer(i);
if(i>=k-1){
res.add(nums[queue.peekFirst()]);
if(i-k+1==queue.peekFirst()){
queue.pollFirst();
}
}
}
return res;
}
}
二分难题 && deque的更多相关文章
- bzoj 2402: 陶陶的难题II 二分答案维护凸包
2402: 陶陶的难题II Time Limit: 40 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 68 Solved: 45[Submi ...
- HDU 4604 Deque 二分最长上升子序列
题目大意就是给一个deque 然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的.最要求deque中最长能是多 ...
- UVA 11610 Reverse Prime (数论+树状数组+二分,难题)
参考链接http://blog.csdn.net/acm_cxlove/article/details/8264290http://blog.csdn.net/w00w12l/article/deta ...
- 【bzoj2402】陶陶的难题II 分数规划+树链剖分+线段树+STL-vector+凸包+二分
题目描述 输入 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi (1<=yi& ...
- BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)
题目大意:略 一定范围内求最大值,考虑二分答案 设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $ 展开可得,$ ...
- bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...
- BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列
传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...
- 八数码难题之 A* 算法
人生第一个A*算法-好激动-- 八数码难题--又称八数码水题,首先要理解一些东西: 1.状态可以转化成整数,比如状态: 1 2 3 4 5 6 7 8 0 可以转化成:123456780这个整数 2. ...
- BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6243 Solved: 2007[Submit] ...
随机推荐
- FW:考查嵌入式C开发人员的最好的16道题(转)
考查一个初级嵌入式系统开发人员的C基本功,附有答案题目由资深嵌入式系统专家拟定, 目的是考查入门级的嵌入式软件开发人员 Gavin Shaw提供详细解答. 编者按:非常基本关于C语言的问题,一个信息类 ...
- IP转换成域名
DNS就是域名解析系统,它可以将IP转换成域名,也可以将域名转换成IP 1. 安装DNS服务 开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉选择“域名服 ...
- WCF技术剖析(卷1)WCF全面解析文摘
第1章 wcf简介 soa体现的是一种对关注点进行分解的思想,与技术无关 soa的基本思想: a.服务自治 独立部署,不依赖其他 b.依赖于开放的标准 采用xml,xsd,及wsdl作为服务描述的 ...
- 8-5 Navicat工具与pymysql模块
一 Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 需要掌握的基本操作 ...
- C++友元函数、友元类
1.什么是友元函数? 友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数. 一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字 ...
- Windows sql语句正则匹配导出数据到本地 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
尝试使用 into outfile导出数据的时候出现错误: The MySQL server is running with the --secure-file-priv option so it c ...
- ImageUploader卸载教程-Xproer.ImageUploader
1.1. 手动卸载控件-Windows XP 主要步骤如下: 1.关闭所有IE 2.打开cmd 3.进入C:\Windows\System32 4.输入命令regsvr32 -u ImageUploa ...
- Understanding String Table Size in HotSpot
In JDK-6962930[2], it requested that string table size be configurable. The resolved date of that b ...
- angularjs之事件绑定、解除事件绑定
今天在开发时,遇到一个坑,花了一下午时间也没找到原因,无奈小菜鸟只能寻求公司里大牛的帮助,果然,大牛就是大牛,对比了几个输出结果,就看出问题所在.所以小菜鸟当然不会错过这个分享的时机啦~废话不多说进入 ...
- ORACLE ERP 的前世今生
一个伟大的公司必有一个伟大的产品.如果说数据库是ORACLE在上世纪最后二十年赖以起家并奠定江湖地位的旗舰产品,那么,企业应用产品(或曰ERP)则毫无疑问是ORACLE在本世纪初的这近十年,征战疆场. ...