LeetCode1237找出给定方程的正整数解
题目
给定方程f和值z,找出给定方程f(x,y)=z的正整数解x,y。f(x,y)关于x、y都是严格单调的。
题目保证 f(x, y) == z 的解处于 1 <= x, y <= 1000 的范围内。
方案
暴力双层循环O(N*N)
暴力,双层循环遍历,由于f是单调的,所以一旦遇到大于,则break。同样遇到等于,也可以加入结果并break。时间复杂度O(N*N),N是最大值1000.
public List<List<Integer>> findSolution(CustomFunction customfunction, int z) {
List<List<Integer>> res=new ArrayList<>();
int MAX_VAL=1000;
for (int i = 1; i <=MAX_VAL ; i++) {
for (int j = 1; j <= MAX_VAL; j++) {
int cul=customfunction.f(i,j);
if(cul==z){
List<Integer> list=new ArrayList<>(2);
list.add(i);
list.add(j);
res.add(list);
break;
}else if(cul>z){
break;
}
}
}
return res;
}
单层循环+二分搜索O(NlogN)
可以一层for+一个二分搜索
由于已知x,y的范围,并且函数单调,则可以用二分。对每个x,尝试二分查找对应的y。O(NlogN)
public List<List<Integer>> findSolution(CustomFunction customfunction, int z) {
List<List<Integer>> res = new ArrayList<>();
int MAX_VAL = 1000;
for (int i = 1; i <= MAX_VAL; i++) {
int j = binarySearch(1, MAX_VAL, customfunction, z, i);
if (j != -1) {
List<Integer> list = new ArrayList<>(2);
list.add(i);
list.add(j);
res.add(list);
}
}
return res;
}
private int binarySearch(int start, int end, CustomFunction customfunction, int z, int i) {
int left = start;
int right = end;
while (left <= right) {
int mid = (left + right) / 2;
int tmpres = customfunction.f(i, mid);
if (tmpres == z) {
return mid;
} else if (tmpres < z) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
双指针O(N)
可以用双指针。
类似矩阵的方法:
从左下角或者右上角找。选择从左下角找,如果f(x,y)<z,则要走向更大值,需要y++想右;如果大于,则需要向上(x--).如果等于,就需要两个方向都要尝试,往任意一个方向都可以。
public List<List<Integer>> findSolution(CustomFunction customfunction, int z) {
List<List<Integer>> res = new ArrayList<>();
int x=1000,y=1;
while(x>=1&&y<=1000){
int tmp=customfunction.f(x,y);
if(tmp<z){
y++;
}else if(tmp>z){
x--;
}else{
List<Integer> list = new ArrayList<>(2);
list.add(x);
list.add(y);
res.add(list);
x--;
}
}
return res;
}
为什么往任意一个方向都可以而不会漏掉?可以类比到矩阵中,如果出现等于,
12345
23456
找f(x,y)=4的,如果从左下角开始,找到第一个4,方案1向上、向右能到第二个4;方案2向右、向上到第二个4.所以当相等的时候,无论向哪个方向都能走到所有的目标值而不会漏掉,因为等会还是会根据单调性向另一个方向走。
LeetCode1237找出给定方程的正整数解的更多相关文章
- leetcode-160场周赛-5238-找出给定方程的正整数解
题目描述: class Solution: def findSolution(self, customfunction: 'CustomFunction', z: int) -> List[Li ...
- Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)
题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...
- [NBUT 1224 Happiness Hotel 佩尔方程最小正整数解]连分数法解Pell方程
题意:求方程x2-Dy2=1的最小正整数解 思路:用连分数法解佩尔方程,关键是找出√d的连分数表示的循环节.具体过程参见:http://m.blog.csdn.net/blog/wh2124335/8 ...
- 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)
示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...
- JAVA冒泡排序/JAVA冒泡排序再找出给定数据中的最大值最小值/JAVA数组排序
//数组中排序 int in[] = {1,6,5,8,9}; Arrays.sort(in); for(int i=0;i<in.length;i++){ Sys ...
- 2019年春季学期第二周作业 基础作业 请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。 输入: 请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。 输出 在不删除原有文件内容的情况下,将最大值和对应的最小下标数值写入文件
~~~ include<stdio.h> include<stdlib.h> int main() { FILE*fp; int i=0,max=0,j=0,maxb=0; i ...
- Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)
题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...
- 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?
给定a.b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a.b文件共同的url? 可以估计每个文件的大小为5G*64=300G,远大于4G.所以不可能将其完全加载到 ...
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
随机推荐
- Centos7部署RabbitMQ的镜像队列集群
一.背景 在上一章节中,我们学会了如何搭建一个单节点的RabbitMQ服务器,但是单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用.此处我们搭建一个3个节点的RabbitMQ集群 ...
- day33 前端之css
day33 前端之css css简介 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. # 语法结构 选择器 { 属性名1,属性值 属性名2,属性值 } # ...
- 22 SHELL 获取当前路径
常见的一种误区,是使用 pwd 命令,该命令的作用是"print name of current/working directory",这才是此命令的真实含义,当前的工作目录,这里 ...
- 零基础学习java------31---------共享单车案例,html快速入门(常见标签,get和post的区别)
一 .单车案例 二. HTML快速入门 红字表示要掌握的内容 超文本标记语言,此处的标记指的即是关键字,其用处是用来写页面(展示数据). 语法:(1)./当前目录:../ 父级目录 (2)注释符号: ...
- 【Linux】【Services】【Docker】网络
容器的网络模型: closed container: 仅有一个接口:loopback 不参与网络通信,仅适用于无须网络通信的应用场景,例如备份.程序调试等: --net none bridged co ...
- 【力扣】973. 最接近原点的 K 个点
我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...
- Sentinel之流控规则
在上文Sentinel流量防卫兵中讲到了Sentinel入门以及流控规则一小部分,而Sentinel还有以下规则: 熔断降级规则 热点参数规则 系统规则 黑白名单规则 本文要讲的是流控规则 流量控制规 ...
- Mysql资料 Binlog
目录 一.简介 二.开启binlog及相关参数 开启 相关操作 三.查看binlog日志 使用mysqlbinlog自带查看命令法 mysql加载方式查询 四.恢复数据 五.命令参数 一.简介 MyS ...
- pipeline when指令
目录 一.简介 二.选项 单独判断 条件组合 一.简介 when指令允许pipeline根据给定的条件,决定是否执行阶段内的步骤.when指令必须至少包含一个条件.when指令除了支持branch判断 ...
- Python用xlrd读取Excel数据到list中再用xlwt把数据写入到新的Excel中
一.先用xlrd读取Excel数据到list列表中(存入列表中的数据如下图所示) import xlrd as xd #导入需要的包 import xlwt data =xd.open_workboo ...