基础算法(一):枚举算法

前言

        从这篇文章开始,小荔枝就开始学习算法和数据结构啦!!!我们先来看看入门的一些基础算法,在这篇文章中,主要介绍的是枚举算法。我们重点需要了解枚举算法使用时需要确定的条件,荔枝会用一道题目来凸显这些条件的重要性。


文章目录

前言

1. 基础概念及条件

基础概念

使用条件

2. 实例剖析——LeeCode 829

题目来源

题目描述

题解思路

核心代码

总结


1. 基础概念及条件

基础概念

        枚举算法在实际应用中很多,几乎大部分的题目都可以使用枚举算法来解决。枚举算法的本质其实就是暴力枚举出所有的可能,再使用条件语句选择正确的答案。枚举算法比较简单粗暴,算法的实现最为简单,在解题的时候我们最先考虑的就是枚举算法。相较于其它的算法,枚举算法的思维量比较小,实现的难度比较低;但是但问题实例的规模比较大的时候,枚举算法的运行速度会比较慢,因此容易出现超时的情况。但是当我们可以在某些局部的地方使用枚举算法可能会得到一种比较好的效果。

使用条件

我们在使用任何算法之前都需要考虑是否符合算法的使用条件,使用枚举算法的条件有两个:、

  • 枚举的可能性是有限的并可被预估;
  • 枚举必须要有一个解的限制的范围,候选答案的范围在求解前有一个确定的集合

2. 实例剖析——LeeCode 829

题目来源

        LeeCode 829.连续整数求和

题目描述

给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 

示例1:

输入:n = 5

输出:2

解释:5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。

示例2:

输入:n = 9

输出:3

解释:9 =  4 + 5 = 2 +3 + 4

题解思路

        在开始枚举之前,我们需要获得枚举的对象可能解集,并根据判断条件获得真解。我们首先来看看题目,题目告诉我们给定一个正整数,需要获得一个或多个连续的整数组合,且该组合中所有数的求和就是我们的给定数值,问我们有多少种组合。换一种说法就是:对于公差为1的等差数列组合,它的每一个的等差数列求和后的值就是我们给定的n,要得到该组合中等差数列的个数。因此我们可以利用等差数列的公式作为题目的突破口:我们设等差数列求和为n,一共有i个项,公差为1,首项是a1,我们给出等差数列求和公式:

n=\frac{({a_{1}}+{a_{n}})*i}{2}

下面对该公式进行推导:

2n=(2{a_{1}}+i-1)*i\rightarrow \frac{2n}{i}=2{a_{1}}+i-1         

\frac{2n}{i}-i+1=2{a_{1}}\geq 2\rightarrow \frac{2n}{i}\geq i+1\rightarrow \frac{2n}{i}> i

得到项数的上限条件:

i<\sqrt{2n}

这时候我们也可以得到2n/i-i+1是2的倍数、2n是项数i的倍数。

        通过上面的推导我们得出枚举项数i的上限截止条件:i*i<2n,同时根据等差数列的计算公式我们知晓2n与i存在倍数关系,根据公式推导出来的结论我们得出另一个判断条件2*n/i-i+1是2的倍数,根据这两个关系得出枚举的真解。其实我们看一下这道题的难点就是推导出枚举的解的限制范围,即项数i的枚举范围,这是很重要的!因此枚举的对象选择和枚举范围的确定在枚举算法中是很重要的。

核心代码

这里给出的是用C++求解的核心代码 ,我们可以看到其实算法实现起来比较简单。

class Solution {
public:
    int consecutiveNumbersSum(int n) {
        int num=0;
        //根据组合项数i的上限确定枚举条件
        for(int i=1;i*i<2*n;i++){
            //根据条件:2n可以整除项数;2*n/i-i+1是2的倍数
            if((2*n)%i==0 && (2*n/i-i+1)%2==0){
                num++;
            }
        }
        return num;
    }
};

总结

        在这篇文章中,荔枝主要介绍了枚举算法的基本概念,并用一个例子来直观地感受枚举算法的操作简便性。由于枚举较为简单,这里就不再过多着墨了哈哈哈,接下来荔枝会整理排序算法的内容嘻嘻嘻。

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

你可能感兴趣的:(初识算法,算法,数据结构)