ACM算法笔记(一)基本概念递归思想常见递归问题

news/2024/7/5 5:41:50

一、基本概念和术语

        1、算法复杂度

                复杂度分析:          事后统计法         大0表示法:T(n)=O(f(n))

2、时间复杂度分析

                只关注循环次数最多的一段代码

                总复杂度等于最高阶的复杂度

嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

                推导大O阶

                        1.用常数1代替运行时间中的所有加法常数项

                        2.仅保留最高阶

                        3.若最高阶项存在且不为1,则将其系数取1

                常见时间复杂度

常数阶        O(1)int i =1(无循环结构
对数阶        O(log2n)

while{ i = i * 2 ;}  (while循环,不线性递增)

        底为其递增步长

线性阶        O(n)for(i=1;i<=n;++i)  {j++;}(for循环,线性递增
线性对数阶 O(nlogN)for+while (本质是n * logN)
平方阶        O(n^2)for嵌套
K次方阶      O(n^K)for的K次嵌套

二、递归思想

        1.一个问题的解可以分解为几个子问题的解(自我调用)

        2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样

        3.存在基线/终止条件

        缺陷:1.空间复杂度高;存在溢出风险;调用较为耗时;存在重复调用问题

        大部分递归可以转换为循环

三、爬楼梯问题

        假设你正在爬楼梯,需要n阶才能达到楼顶,每次你可以爬1~1个台阶,你有多少种不同的方法爬到楼顶?

        解题思路:若第一次走了一步,那解决方法就等于1+剩下的可能,依此类推

                          终止条件:f(1)=1,f(1)=2均为终止条件

public int Climb(int n)
{
    if(n==1) return 1;
    if(n==2) return 2;
    return Climb(n-1)+Climb(n-2);
}

                循环解法,自底向上累加

public Climb()
{
    if(n==1) return 1;
    if(n==2) return 2;
    int result = 0;
    int pre = 2;
    int prePre = 1;
    for(int i = 3; i<=n;++i){
        result = pre + prePre;
        prePre = pre;
        pre = result;
    }
    return result;
}


http://www.niftyadmin.cn/n/4217507.html

相关文章

GRUB 引导程序配置大全

引自&#xff1a;http://blog.chinaunix.net/u/30557/showart_312917.html 1. GRUB 介绍计算机在启动的时候&#xff0c;首先由BIOS中的程序执行自检&#xff0c;自检通过后&#xff0c;就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序&#xff08;一般在启动盘…

ACM算法笔记(二)斐波那契数列数组类型

一、斐波那契数列 定义 与爬楼梯问题的区别是&#xff1a;终止条件不同 代码参考爬楼梯问题 二、数组类型 1.两数之和 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找到目标值target的那两个整数&#xff0c;并返回他们的数组下标 例如&#xff1…

ACM算法笔记(三)链表算法

一、合并两个有序链表 将两个升序链表合并为一个升序链表后返回&#xff0c;新链表是通过拼接两个链表的节点组成的 思路&#xff1a;分别比较两个链表头部的节点&#xff0c;将较小节点的连接到新链表后 public ListNode mergeTwoList(ListNode l1,ListNode l2) {if(l1 null…

Vue学习Day1 vue安装、vue体验程序、vue中的MVVM、vue的生命周期、vue的一些简单指令

想利用暑假时间好好学习一下vue&#xff0c;会记录每一天的学习内容。 今天是学习vue的第1天&#xff01; 起起伏伏乃人生常态&#xff0c;继续加油&#xff5e; 学习内容1. Vue.js 安装方式一&#xff1a;直接CDN引入方式二&#xff1a;下载和引入方式三&#xff1a;NPM安装2.…

Linux 小问题&小技巧

001&#xff1a;建立管理员组内一般用户(CentOS)&#xff1a;  在一般情况下&#xff0c;一般用户通过执行 "su - " 命令&#xff0c;再输入正确root密码就可登录root桌面&#xff0c;现建功立业一个管理员的组&#xff0c;只允许这个组的用户执行 " su - &qu…

ACM算法笔记(四)栈、队列、二叉树的遍历

一、用栈实现队列 用两个栈实现队列&#xff08;先进先出&#xff09;&#xff0c;队列应当支持(push、pop、peek、empty) 思路&#xff1a;双栈一个负责输入一个负责输出&#xff08;压入操作正常&#xff0c;弹出时将输入栈的元素依次弹出然后压入输出栈&#xff09; privat…

java开发为什么需要UML

出处 www.cnejb.com 知道UML造成了怎样的局面大混乱吗&#xff1f;知道什么样的功能是UML拥有但JAVA不具备的吗&#xff1f;知道我们为什么需要除JAVA外的另一种电脑语言吗&#xff1f;UML并不仅仅只是JAVA或者其它什么语言的替代品。UML并不仅仅只是JAVA或者其它什么语言的替代…