找出给定方程的正整数解[单增或者有序概念与二分&双指针的紧密联系]

前言

双指针取值常用于有序/单增/单减这些场景中,利用有序大大降低时间复杂度,如果没序,就O(nlogn)排个序,也比O(n方)好。同样的,二分法也是在同样的场景中,有序/单增/单减,将时间复杂度降到O(logn),非常方便。

一、找出给定方程的正整数解

在这里插入图片描述

二、双指针&二分法

1、二分法

由于每一种函数都是单增函数,意味着随着x/y的单增输入,得到的结果z也是单增的,说明只有一个结果为z,可以固定x,二分寻找那个y,使得f(x,y) = z

// 结果单增,可以利用二分法寻找result == z
func findSolution(customFunction func(int, int) int, z int) [][]int {
    rs := [][]int{}
    for x := 1;x <= 1000;x++ {
        // 先剪枝
        if customFunction(x,1) > z {
            return rs
        }
        // 再二分
        low,high := 1,1000
        for ;low <= high;{
            mid := low + (high - low) >> 1
            midVal := customFunction(x,mid)

            if midVal == z {
                rs = append(rs,[]int{x,mid})
                break
            }
            if midVal < z {
                low = mid + 1
            }else {
                high = mid - 1
            }
        }
    }
    return rs
}

2、双指针

x/y和f(x,y)有一致的单增性,当f(x,y) > z时,说明需要x - 1/y - 1,当f(x,y) < z时,说明需要x + 1 / y + 1,当f(x,y) = z时,则加入。
所以不用暴力循环x / y 从1 - 1000,而是x从1出发,y从1000出发,通过x++/y–来控制f(x,y)的大小向z靠近。

// 双指针利用单调增
func findSolution(customFunction func(int, int) int, z int) [][]int {
    var rs [][]int
    result := 0
    for x,y := 1,1000; x <= 1000 && y >= 1; {
        result = customFunction(x,y)

        if result > z {
            y--
        } else if result < z {
            x++
        }else {
            rs = append(rs,[]int{x,y})
            x++
            y--
        }
    }
    return rs
}

总结

1)在有序/单增/单减的场景中,一定联想双指针与二分法,非常方便。有时候比较隐式,可以转换到有序场景,进行一个问题转换。

参考文献

[1] LeetCode 找出给定方程的正整数解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值