美文网首页
寻找和为定值的4个数

寻找和为定值的4个数

作者: CGPointZero | 来源:发表于2021-12-20 09:28 被阅读0次

原题如下:

将写有数字的n个纸片放入一个纸箱子中,然后你和你的朋友从纸箱子中抽取4张纸片,每次记下纸片上的数字后放回子箱子中,如果这4个数字的和是m,代表你赢,否则就是你的朋友赢。
请编写一个程序,当纸片上所写的数字是a1,a2,a3,a4,..,an时,是否存在抽取4次和为m的方案,如果存在,输出YES;否则,输出NO。

首先想到最简单的方案是直接4层循环:

func jude(_ m: Int, _ a: [Int]) -> Bool {
    for a1 in a {
        for a2 in a {
            for a3 in a {
                for a4 in a {
                    if a1 + a2 + a3 + a4 == m {
                        return true
                    }
                }
            }
        }
    }
    return false
}

时间复杂度是O(n^4),这个时间复杂度太大了。。。

给定的条件是:

ai + aj + as + at = m

我们可以变换一下等式,使之成为:

(ai + aj) + (as + at) = m

这样就变成了找两个数的和等于定值了:

a + b = sum

a、b可以看成是数组中任意两个数组相加的合值。那么求解过程可以表示为先算出数组中任意两个数两两相加的一个新数组,然后在这个新数组中找两个数,使得他们的和等于定值。

    var sumArray = [Int]()
    for a1 in a {
        for a2 in a {
            let sum = a1 + a2
            sumArray.append(sum)
        }
    }

得到数组中任意两数两两相加和的数组sumArray.
寻找两个数的和为定值:

    for s1 in sumArray {
        for s2 in sumArray {
            if m == s1 + s2 {
                return true
            }
        }
    }

完整代码如下:

func jude(_ m: Int, _ a: [Int]) -> Bool {
    var sumArray = [Int]()
    for a1 in a {
        for a2 in a {
            let sum = a1 + a2
            sumArray.append(sum)
        }
    }
    for s1 in sumArray {
        for s2 in sumArray {
            if m == s1 + s2 {
                return true
            }
        }
    }
    return false
}

测试一下:

let ret = jude(10, [1, 3, 5])
print(ret)//true

let ret = jude(9, [1, 3, 5])
print(ret)//false

这种解法的时间复杂度是O(n^2)。

相关文章

  • 寻找和为定值的4个数

    原题如下: 将写有数字的n个纸片放入一个纸箱子中,然后你和你的朋友从纸箱子中抽取4张纸片,每次记下纸片上的数字后放...

  • 寻找和为定值的多个数

    寻找和为定值的多个数 题目描述: 输入两个整数 n 和 sum ,从数列 1,2,3 ....... n 中随意...

  • 寻找和为定值的两个数

    寻找和为定值的两个数 题目描述: 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如...

  • 7. 寻找和为定值的任意多个数

    一、寻找和为定值的两个数 算法思想:排序,然后两端扫描。时间复杂度O(nlogn+n) 空间复杂度O(1)散列映射...

  • 【剑指offer】和为定值的两个数

    题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,输出任意一对即可 输入:...

  • K数和问题

    Leetcode上有一个系列的问题 在一个数组中找寻2个数的和值为target 在一个数组中找寻3个数的和值为ta...

  • 2018-03-08数组特征

    问题描述给出n个数,找出这n个数的最大值,最小值,和。 输入格式第一行为整数n,表示数的个数。 第二行有n个数,为...

  • 最大连续子序列的和

    有一个数组,如1, -5, 8, 3, -4, 15, -8,查找其中连续和最大的相邻串的值。在本例中,最大值为8...

  • 蓝桥杯:数列特征--Python解法

    问题描述 给出n个数,找出这n个数的最大值,最小值,和。 输入格式 第一行为整数n,表示数的个数。 第二行有n个数...

  • 8.数列特征

    /** 问题描述 给出n个数,找出这n个数的最大值,最小值,和。 输入格式 第一行为整数n,表示数的个数。 第二行...

网友评论

      本文标题:寻找和为定值的4个数

      本文链接:https://www.haomeiwen.com/subject/zkwafrtx.html