题目

给定方程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找出给定方程的正整数解的更多相关文章

  1. leetcode-160场周赛-5238-找出给定方程的正整数解

    题目描述: class Solution: def findSolution(self, customfunction: 'CustomFunction', z: int) -> List[Li ...

  2. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  3. [NBUT 1224 Happiness Hotel 佩尔方程最小正整数解]连分数法解Pell方程

    题意:求方程x2-Dy2=1的最小正整数解 思路:用连分数法解佩尔方程,关键是找出√d的连分数表示的循环节.具体过程参见:http://m.blog.csdn.net/blog/wh2124335/8 ...

  4. 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)

    示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...

  5. JAVA冒泡排序/JAVA冒泡排序再找出给定数据中的最大值最小值/JAVA数组排序

    //数组中排序    int in[] = {1,6,5,8,9};    Arrays.sort(in);    for(int i=0;i<in.length;i++){       Sys ...

  6. 2019年春季学期第二周作业 基础作业 请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。 输入: 请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。 输出 在不删除原有文件内容的情况下,将最大值和对应的最小下标数值写入文件

    ~~~ include<stdio.h> include<stdlib.h> int main() { FILE*fp; int i=0,max=0,j=0,maxb=0; i ...

  7. Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)

    题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...

  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.所以不可能将其完全加载到 ...

  9. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

随机推荐

  1. Centos7部署RabbitMQ的镜像队列集群

    一.背景 在上一章节中,我们学会了如何搭建一个单节点的RabbitMQ服务器,但是单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用.此处我们搭建一个3个节点的RabbitMQ集群 ...

  2. day33 前端之css

    day33 前端之css css简介 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. # 语法结构 选择器 { 属性名1,属性值 属性名2,属性值 } # ...

  3. 22 SHELL 获取当前路径

    常见的一种误区,是使用 pwd 命令,该命令的作用是"print name of current/working directory",这才是此命令的真实含义,当前的工作目录,这里 ...

  4. 零基础学习java------31---------共享单车案例,html快速入门(常见标签,get和post的区别)

     一 .单车案例 二. HTML快速入门 红字表示要掌握的内容 超文本标记语言,此处的标记指的即是关键字,其用处是用来写页面(展示数据). 语法:(1)./当前目录:../ 父级目录 (2)注释符号: ...

  5. 【Linux】【Services】【Docker】网络

    容器的网络模型: closed container: 仅有一个接口:loopback 不参与网络通信,仅适用于无须网络通信的应用场景,例如备份.程序调试等: --net none bridged co ...

  6. 【力扣】973. 最接近原点的 K 个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  7. Sentinel之流控规则

    在上文Sentinel流量防卫兵中讲到了Sentinel入门以及流控规则一小部分,而Sentinel还有以下规则: 熔断降级规则 热点参数规则 系统规则 黑白名单规则 本文要讲的是流控规则 流量控制规 ...

  8. Mysql资料 Binlog

    目录 一.简介 二.开启binlog及相关参数 开启 相关操作 三.查看binlog日志 使用mysqlbinlog自带查看命令法 mysql加载方式查询 四.恢复数据 五.命令参数 一.简介 MyS ...

  9. pipeline when指令

    目录 一.简介 二.选项 单独判断 条件组合 一.简介 when指令允许pipeline根据给定的条件,决定是否执行阶段内的步骤.when指令必须至少包含一个条件.when指令除了支持branch判断 ...

  10. Python用xlrd读取Excel数据到list中再用xlwt把数据写入到新的Excel中

    一.先用xlrd读取Excel数据到list列表中(存入列表中的数据如下图所示) import xlrd as xd #导入需要的包 import xlwt data =xd.open_workboo ...