当前位置: 首页 > news >正文

LeetCode-1237. 找出给定方程的正整数解【双指针,二分查找】

LeetCode-1237. 找出给定方程的正整数解【双指针,二分查找】

  • 题目描述:
  • 解题思路一:双指针。首先我们不管f是什么,即function_id等于什么不管。但是我们可以调用customfunction中的f函数,然后我们遍历x,y(1 <= x, y <= 1000)只要f(x,y)=z的(x,y)即是我们需要的答案。然后我们从x=1与y=1000开始遍历。此时有三种情况:
  • 解题思路二:二分查找。枚举x,二分查找y。找到之后x增大因为f对x,y递增故之后的y必小于middle。即f(x,middle)=z若要f(x+1,y)=z那么y必小于middle;对右边界的优化。
  • 解题思路三:0

题目描述:

给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) == z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。

尽管函数的具体式子未知,但它是单调递增函数,也就是说:

f(x, y) < f(x + 1, y)
f(x, y) < f(x, y + 1)
函数接口定义如下:

interface CustomFunction {
public:
// Returns some positive integer f(x, y) for two positive integers x and y based on a formula.
int f(int x, int y);
};
你的解决方案将按如下规则进行评判:

判题程序有一个由 CustomFunction 的 9 种实现组成的列表,以及一种为特定的 z 生成所有有效数对的答案的方法。
判题程序接受两个输入:function_id(决定使用哪种实现测试你的代码)以及目标结果 z 。
判题程序将会调用你实现的 findSolution 并将你的结果与答案进行比较。
如果你的结果与答案相符,那么解决方案将被视作正确答案,即 Accepted 。

示例 1:

输入:function_id = 1, z = 5
输出:[[1,4],[2,3],[3,2],[4,1]]
解释:function_id = 1 暗含的函数式子为 f(x, y) = x + y
以下 x 和 y 满足 f(x, y) 等于 5:
x=1, y=4 -> f(1, 4) = 1 + 4 = 5
x=2, y=3 -> f(2, 3) = 2 + 3 = 5
x=3, y=2 -> f(3, 2) = 3 + 2 = 5
x=4, y=1 -> f(4, 1) = 4 + 1 = 5

示例 2:

输入:function_id = 2, z = 5
输出:[[1,5],[5,1]]
解释:function_id = 2 暗含的函数式子为 f(x, y) = x * y
以下 x 和 y 满足 f(x, y) 等于 5:
x=1, y=5 -> f(1, 5) = 1 * 5 = 5
x=5, y=1 -> f(5, 1) = 5 * 1 = 5

提示:

1 <= function_id <= 9
1 <= z <= 100
题目保证 f(x, y) == z 的解处于 1 <= x, y <= 1000 的范围内。
在 1 <= x, y <= 1000 的前提下,题目保证 f(x, y) 是一个 32 位有符号整数。

解题思路一:双指针。首先我们不管f是什么,即function_id等于什么不管。但是我们可以调用customfunction中的f函数,然后我们遍历x,y(1 <= x, y <= 1000)只要f(x,y)=z的(x,y)即是我们需要的答案。然后我们从x=1与y=1000开始遍历。此时有三种情况:

  • 情况一:f(x,y)>z,那么固定y,继续增大x,函数值也会继续增大。显然不符合题意。故将y减1缩小答案。
  • 情况二:f(x,y)<z,那么固定y,继续增大x,函数值也会继续增大。显然是符合题意的。故将x加1增大答案。
  • 情况三:f(x,y)=z,先将(x,y)加入答案,然后固定y,继续增大x,函数值也会继续增大。显然是不符合题意的。故将y减1缩小答案。(类似情况一)
/** // This is the custom function interface.* // You should not implement it, or speculate about its implementation* class CustomFunction {* public:*     // Returns f(x, y) for any given positive integers x and y.*     // Note that f(x, y) is increasing with respect to both x and y.*     // i.e. f(x, y) < f(x + 1, y), f(x, y) < f(x, y + 1)*     int f(int x, int y);* };*/class Solution {
public:vector<vector<int>> findSolution(CustomFunction& customfunction, int z) {vector<vector<int>> ans;int x=1,y=1000;while(x<=1000&&y>=1){int t=customfunction.f(x,y);if(t>z) --y;else if(t<z) ++x;else ans.push_back({x++,y--});}return ans;        }
};

时间复杂度:O(2C)//C=1000
空间复杂度:O(1)

解题思路二:二分查找。枚举x,二分查找y。找到之后x增大因为f对x,y递增故之后的y必小于middle。即f(x,middle)=z若要f(x+1,y)=z那么y必小于middle;对右边界的优化。

/** // This is the custom function interface.* // You should not implement it, or speculate about its implementation* class CustomFunction {* public:*     // Returns f(x, y) for any given positive integers x and y.*     // Note that f(x, y) is increasing with respect to both x and y.*     // i.e. f(x, y) < f(x + 1, y), f(x, y) < f(x, y + 1)*     int f(int x, int y);* };*/class Solution {
public:vector<vector<int>> findSolution(CustomFunction& customfunction, int z) {vector<vector<int>> res;int left = 1, right = 1000;//右边界right会不断缩小for(int x=1;x<=1000;x++) {//枚举x,二分查找yleft = 1;//每次左边界left从1开始while(left<=right) {int middle=(left+right)/2;int t=customfunction.f(x, middle);if(t==z){res.push_back({x, middle});right=middle-1;//缩小右边界break;//break之后x增大因为f对x,y递增故之后的y必小于middle。即f(x,middle)=z若要f(x+1,y)=z那么y必小于middle;}else if(t<z) left=middle + 1;else right=middle-1;//缩小右边界}//其实发现 right == 0 了可以直接返回}return res;}
};

时间复杂度:O(C+logC)//C=1000
空间复杂度:O(1)

解题思路三:0


http://www.lryc.cn/news/11130.html

相关文章:

  • 广度优先搜索算法 - 迷宫找路
  • 泡脚材料简记
  • 【计算机网络】因特网概述
  • STC单片机 VS/HX1838红外接收和发送实验
  • 前端开发常用案例(一)
  • Linux 日志查找常用命令
  • CleanMyMac4.12.5最新版安装下载教程
  • RFID射频识别技术(四) RFID高频电路基础|课堂笔记|10月11日
  • 数据库系统是什么?它由哪几部分组成?
  • 华为OD机试题 - 任务混部(JavaScript)
  • 键盘输入a,到屏幕显示,操作系统做了什么
  • Python机器学习入门笔记(2)—— 分类算法
  • Docker镜像发布到阿里云和私有库
  • 初识CSS,美化HTML
  • 华为OD机试 - 二维矩阵的最大值(Python)
  • 华为OD机试 - 快递业务站(Python)
  • 百度沈抖:文心一言将通过百度智能云对外提供服务
  • cmd 窗口、记事本打开后一片空白且几秒钟后闪退的问题解决方案汇总
  • Linux 安装 SNMP服务
  • 华为OD机试 - 滑动窗口最大和(Python)
  • 用Nacos搭建微服务操作
  • ChatGPT模型采样算法详解
  • 【Unity3d】Unity与iOS通信
  • RDD的持久化【博学谷学习记录】
  • Python3 正则表达式
  • Qt-基础
  • ABB机器人将实时坐标发送给西门子PLC的具体方法示例
  • 反向传播与梯度下降详解
  • Skywalking ui页面功能介绍
  • 哪里可以找到免费的 PDF 阅读编辑器?7 个免费 PDF 阅读编辑器分享