Leetcode(每日一题)——1237. 找出给定方程的正整数解

news2024/11/17 9:49:58

摘要

1237. 找出给定方程的正整数解

一、暴力求解

根据题目给出的x和y的取值范围,枚举所有的 x,y数对,保存满足f(x,y)=z的数对,最后返回结果。

    /**
     * @description 使用的暴力法 直接遍历符合的就添加到结果中
      * @param: customfunction
     * @param: z
     * @date: 2023/2/18 9:20
     * @return: java.util.List<java.util.List<java.lang.Integer>>
     * @author: xjl
    */
    public List<List<Integer>> findSolution(CustomFunction customfunction, int z) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        for (int x = 1; x <= 1000; x++) {
            for (int y = 1; y <= 1000; y++) {
                if (customfunction.f(x, y) == z) {
                    List<Integer> pair = new ArrayList<Integer>();
                    pair.add(x);
                    pair.add(y);
                    res.add(pair);
                }
            }
        }
        return res;
    }

复杂度分析

  • 时间复杂度:O(mn),其中m是x的取值数目,n是y的取值数目。
  • 空间复杂度:O(1)。返回值不计入空间复杂度。

二、二分查找

当我们固定 x=x0时,函数 g(y)=f(x0,y)是单调递增函数,可以通过二分查找来判断是否存在 y=y0,使 g(y0)=f(x0,y0)=z成立。

    /**
     * @description 使用的二分法来是实现
      * @param: customfunction
     * @param: z
     * @date: 2023/2/18 9:20
     * @return: java.util.List<java.util.List<java.lang.Integer>>
     * @author: xjl
    */
    public List<List<Integer>> findSolution2(CustomFunction customfunction, int z) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        for (int x = 1; x <= 1000; x++) {
            int yleft = 1, yright = 1000;
            while (yleft <= yright) {
                int ymiddle = (yleft + yright) >> 1;
                if (customfunction.f(x, ymiddle) == z) {
                    List<Integer> pair = new ArrayList<Integer>();
                    pair.add(x);
                    pair.add(ymiddle);
                    res.add(pair);
                    break;
                }
                if (customfunction.f(x, ymiddle) > z) {
                    yright = ymiddle - 1;
                } else {
                    yleft = ymiddle + 1;
                }
            }
        }
        return res;
    }

复杂度分析

  • 时间复杂度:O(mlog⁡n),其中m是x的取值数目,n是y的取值数目。
  • 空间复杂度:O(1)。返回值不计入空间复杂度。

三、双指针求解

假设 x1<x2,且 f(x1,y1)=f(x2,y2)=z,显然有 y1>y2。因此我们从小到大进行枚举x,并且从大到小枚举y,当固定x 时,不需要重头开始枚举所有的y,只需要从上次结束的值开始枚举即可。

/**
     * @description 使用双指针来实现 固定x 来找到y 然后x增加 y必然要减少f(x,y)=z
      * @param: customfunction
     * @param: z
     * @date: 2023/2/18 9:28
     * @return: java.util.List<java.util.List<java.lang.Integer>>
     * @author: xjl
    */
    public List<List<Integer>> findSolution3(CustomFunction customfunction, int z) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        for (int x = 1, y = 1000; x <= 1000 && y >= 1; x++) {
            while (y >= 1 && customfunction.f(x, y) > z) {
                y--;
            }
            if (y >= 1 && customfunction.f(x, y) == z) {
                List<Integer> pair = new ArrayList<Integer>();
                pair.add(x);
                pair.add(y);
                res.add(pair);
            }
        }
        return res;
    }

复杂度分析

  • 时间复杂度:O(m+n),其中m是x的取值数目,n是y的取值数目。
  • 空间复杂度:O(1)。返回值不计入空间复杂度。

四、搜索二维矩阵的目标值

240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

    每行的元素从左到右升序排列。
    每列的元素从上到下升序排列。

4.1 暴力求解

我们直接遍历整个矩阵matrix,判断target是否出现即可。

    /**
     * @description 直接暴力的方法 但是一般都是超时结果
      * @param: matrix
     * @param: target
     * @date: 2023/2/18 9:48
     * @return: boolean
     * @author: xjl
    */
    public boolean searchMatrix(int[][] matrix, int target) {
        for (int[] arr:matrix){
            for (int i:arr){
                if (i==target){
                    return true;
                }
            }
        }
        return false;
    }

复杂度分析

  • 时间复杂度:O(mn)。
  • 空间复杂度:O(1)。

4.2 利用二分查找算法求解

   /**
     * @description 利用二分法来 因为每一行都是递增的
      * @param: matrix
     * @param: target
     * @date: 2023/2/18 9:49
     * @return: boolean
     * @author: xjl
    */
    public boolean searchMatrix2(int[][] matrix, int target) {
        for (int[] arr:matrix){
            // 调用了系统的二分法来实现
            if (Arrays.binarySearch(arr,target)>=0){
                return true;
            }
        }
        return false;
    }

 复杂度分析

  • 时间复杂度:O(mlog⁡n)。对一行使用二分查找的时间复杂度为 O(log⁡n),最多需要进行 m次二分查找。
  • 空间复杂度:O(1)。

4.3 单调性扫描求解

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        int x = 0, y = n - 1;
        while (x < m && y >= 0) {
            if (matrix[x][y] == target) {
                return true;
            }
            if (matrix[x][y] > target) {
                --y;
            } else {
                ++x;
            }
        }
        return false;
    }
}

复杂度分析

  • 时间复杂度:O(m+n)。在搜索的过程中,如果我们没有找到 target,那么我们要么将y 减少 1,要么将x增加1。由于 (x,y)的初始值分别为 (0,n−1),因此y 最多能被减少n次,x最多能被增加m 次,总搜索次数为 m+n。在这之后,x 和y 就会超出矩阵的边界。
  • 空间复杂度:O(1)。

博文参考

《leetcode》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

能不能做好性能测试,要看你有没有性能测试思维

获取性能需求 01、用户数信息 1、调查系统当前和未来使用的用户数 系统用户数 本系统目前注册的用户数&#xff0c;注册用户数并不代表他会每天并且无时无刻的使用着。 在线用户数 同时在线对系统进行操作的用户数量&#xff08;相当于混合场景&#xff09; 并发用户数 …

第9天-商品服务(电商核心概念,属性分组开发及分类和品牌的级联更新)

1.电商核心概念 1.1.SPU与SKU SPU&#xff1a;Standard Product Unit&#xff08;标准化产品单元&#xff09; 是商品信息聚合的最小单位&#xff0c;是一组可复用、易检索的标准化信息的集合&#xff0c;该集合描述了一个 产品的特性。 决定商品属性的值 SKU&#xff1a;Stock…

第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV

1.题目链接&#xff1a;123. 买卖股票的最佳时机 III 题目描述&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#…

基于深度神经网络的3D模型合成【Transformer vs. CNN】

本文介绍用于3D模型合成的transformer网络与深度卷积网络。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 1、概述 从单一视角合成 3D 数据是一种基本的人类视觉功能&#xff0c;这对计算机视觉算法来说极具挑战性&#xff0c;这是一个共识。 但在 3D 传感器&#…

Fedora Linux未来五年规划

Fedora 委员会一直致力于起草战略计划&#xff0c;以帮助 Fedora Linux 更好地发展。近日 Fedora 委员会公布了一份 “《未来五年的 Fedora Linux 》” 战略计划草案&#xff0c;这份草案里面包含了他们的雄心壮志&#xff1a;每周将 Fedora 的活跃贡献者人数增加一倍。 Fedora…

如何获取docpelx求解目标函数后的数据;在解决目标优化问题之后,如何获取相关数据;获取决策变量的具体数值

获取优化问题的自变量取值和目标函数取值 说明通过 mdl.integer_var() 定义的决策变量&#xff0c;获取求解值决策变量获取目标函数取值获取具体代码&#xff1a;通过 mdl.continuous_var_list() 定义的决策变量&#xff0c;获取求解值具体代码说明 本次的代码环境是 python中…

【WEB安全】SQL注入挖掘

文章目录前言一、sql注入的分类注入漏洞存在位置二、漏洞挖掘Google语法疑似注入点手工挖掘批量挖取此类漏洞已知sql注入漏洞挖掘总结免责声明&#xff1a;前言 2021年OWASP发布漏洞威胁榜单&#xff0c;SQL注入从第一名下降到第三&#xff08;https://owasp.org/Top10/&#…

从0开始学python -34

Python3 输入和输出-2 读和写文件 open() 将会返回一个 file 对象&#xff0c;基本语法格式如下: open(filename, mode)filename&#xff1a;包含了你要访问的文件名称的字符串值。mode&#xff1a;决定了打开文件的模式&#xff1a;只读&#xff0c;写入&#xff0c;追加等。…

数据分析| Pandas200道练习题,使用Pandas连接MySQL数据库

文章目录使用Pandas连接数据库编码环境依赖包read_sql_query()的使用read_sql_table()的使用read_sql() 函数的使用to_sql()写入数据库的操作删除操作更新操作总结&#xff1a;使用Pandas连接数据库 通过pandas实现数据库的读&#xff0c;写操作时&#xff0c;首先需要进行数据…

kubernetes教程 -- k8s组件

k8s组件 maste节点 apiServer&#xff1a;资源操作的唯一入口&#xff0c;接受用户的输入&#xff0c;提供认证&#xff0c;控制访问等功能Scheduler&#xff1a;负责集群的资源调度&#xff0c;按照预定的调度策略将Pod调度到相应的node节点上controllerManager&#xff1a;负…

JVM学习篇剖析JVM类加载机制

1. 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 public class Math {private static int initData 6666;public static User user new User();private int compute() {int a 1;int b 3;int c (…

【vue后台管理系统】基于Vue+Element-UI+ECharts开发通用管理后台(下)

文章目录面包屑导航制作效果展示思路分析代码实现过程需求优化用户管理页面效果展示新增用户表单实现table组件编写分页功能编写搜索功能编写附&#xff1a;ES6的解构赋值数组模型的解构&#xff08;Array&#xff09;对象模型的解构&#xff08;Object&#xff09;面包屑导航制…

[Linux篇] Linux常见命令和权限

文章目录使用XShell登录Linux1.Linux常用基本命令&#xff1a;1.1 ls&#xff08;列出当前的目录下都有哪些文件和目录&#xff09;1.2 cd (change directory 切换目录)1.3 pwd&#xff08;查看当前目录的绝对路径&#xff09;1.4 touch&#xff08;创建文件&#xff09;1.5 ca…

数据库系统是什么?它由哪几部分组成?

数据库系统&#xff08;Database System&#xff0c;DBS&#xff09;由硬件和软件共同构成。硬件主要用于存储数据库中的数据&#xff0c;包括计算机、存储设备等。软件部分主要包括数据库管理系统、支持数据库管理系统运行的操作系统&#xff0c;以及支持多种语言进行应用开发…

TestNG单元测试框架-常用注解介绍以及testng和Junit的区别【杭州多测师_王sir】【杭州多测师】...

一、TestNG单元测试框架-常用注解介绍 testng学习网址&#xff1a;https://www.jc2182.com/testng/testng-environment.html 1、Before类别和After类别注解按照如下循序执行BeforeSuite->BeforeTest->BeforeClass->{BeforeMethod->Test->AfterMethod}->After…

微信支付Native下单API接口正确调用姿势

商户Native支付下单接口&#xff0c;微信后台系统返回链接参数code_url&#xff0c;商户后台系统将code_url值生成二维码图片&#xff0c;用户使用微信客户端扫码后发起支付。 文档地址&#xff1a;微信支付-开发者文档 目录 一、Native下单接口简介 二、如何正确调通接口 (…

5. AOP

一、如何定义一个MethodHandler? 1.Controller注解修饰的类 1.注册成Spring Bean 2.表示它是一个SpringMVC下的Controller 2.在这个类下的方法中&#xff0c;只要被RequestMapping修饰&&方法的形参符合规定&#xff08;需要看文档&#xff09; 方法的返回值符合规定…

VK0256/B/C玩具、冷气机等段码液晶驱动芯片(IC)(32EGx8COM)技术资料选表

K PP 2543型号&#xff1a;VK0256/B/C封装形式&#xff1a;QFP64/LQFP64/LQFP52 VK0256/B/C是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大256点&#xff08;32EGx8COM&#xff09;的LCD屏。单片机可通过3/4线串行接口配置显示参数和发送显示数据&#xff0c;也可通过…

与ChatGpt聊天,学习golang标签的反射机制

与ChatGpt聊天&#xff0c;学习golang标签的反射机制引ChatGPT火了以后&#xff0c;本拐先是恐惧&#xff0c;之后是拥抱。最近很多编程知识的学习&#xff0c;都是通过 chatgpt来搞定。众所周知&#xff0c;本拐就是一个啥技术都半斤八两的程序员&#xff0c;这次&#xff0c;…

05服务发现:引入etcd服务注册中心

在分布式微服务架构中,服务注册发现组件(通常称为服务注册中心)往往有着举足轻重的作用,它的性能与稳定可能会直接影响到整个服务的状态,比如Spring Cloud中的Eureka、Dubbo中的Zookeeper等等,接下来我们就gRPC微服务中最常见的服务注册中心etcd,来讲述下两者在具体是怎…