01.01 数据结构与算法

本文探讨了数据的逻辑结构(如集合、线性、树形和图形结构),以及物理结构(顺序和链式存储)。重点介绍了算法的关键特性,如输入、输出和算法复杂度,并强调了LeetCode在提升编程技能和算法能力,特别是在求职过程中的作用。
摘要由CSDN通过智能技术生成

逻辑结构(Logical Structure):数据元素之间的相互关系 根据元素之间具有的不同关系,通常我们可以将数据的逻辑结构分为以下四种:

  1. 集合结构:数据元素同属于一个集合,除此之外无其他关系。
  2. 线性结构:数据元素之间是「一对一」关系
  3. 树形结构:数据元素之间是「一对多」的层次关系。
  4. 图形结构:数据元素之间是[多对多]的关系

物理结构(Physical Structure):数据的逻辑结构在计算机中的存储方式 1.顺序存储结构(Sequential Storage Structure):将数据元素存放在一片地址连续的存储单元里,数据元素之间的逻辑关系通过数据元素的存储地址来直接反映。 2.链式存储结构(Linked Storage Structure):将数据元素存放在任意的存储单元里,存储单元可以连续,也可以不连续。

算法(Algorithm):解决特定问题求解步骤的准确而完整的描述,在计算机中表现为一系列指令的集合,算法代表着用系统的方法描述解决问题的策略机制。

算法的基本特性 1.输入:对于待解决的问题,都要以某种方式交给对应的算法。在算法开始之前最初赋给算法的参数称为输入。比如示例 中的输入就是出发地和目的地的参数(北京,上海),示例 中的输入就是 个整数构成的数组。一个算法可以有多个输入,也可以没有输入。比如示例 是对固定问题的求解,就可以看做没有输入。 2.输出:算法是为了解决问题存在的,最终总需要返回一个结果。所以至少需要一个或多个参数作为算法的输出。比如示例 中的输出就是最终选择的交通方式,示例 中的输出就是和的结果。示例 中的输出就是排好序的数组。 3.有穷性:算法必须在有限的步骤内结束,并且应该在一个可接受的时间内完成。比如示例 ,如果我们选择五一从上海到北京去旅游,结果五一纠结了三天也没决定好怎么去北京,那么这个旅游计划也就泡汤了,这个算法自然也是不合理的。 确定性:组成算法的每一条指令必须有着清晰明确的含义,不能令读者在理解时产生二义性或者多义性。就是说,算法的每一个步骤都必须准确定义而无歧义。 可行性:算法的每一步操作必须具有可执行性,在当前环境条件下可以通过有限次运算实现。也就是说,每一步都能通过执行有限次数完成,并且可以转换为程序在计算机上运行并得到正确的结果。 算法追求的目标 1.所需运行时间更少(时间复杂度更低); 2.占用内存空间更小(空间复杂度更低)。 一个好的算法还应该追求以下目标: 1.正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。 2.可读性:可读性指的是算法遵循标识符命名规则,简洁易懂,注释语句恰当,方便自己和他人阅读,便于后期修改和调试。 3.健壮性:健壮性指的是算法对非法数据以及操作有较好的反应和处理。

常根据从小到大排序,常见的算法复杂度主要有:O(1)< O(log n) < O(n) < O(n²) < O(2的n次方)等。 常见的时间复杂度有:O(1),O(log n),O(n),O(n*log n),O(n²),O(n³),O(2的n次方),O(n!) 常见的空间复杂度有:O(1),O(log n),O(n),O(n²)

LeetCode是什么

「LeetCode」 是一个代码在线评测平台(Online Judge),包含了 算法、数据库、Shell、多线程 等不同分类的题目,其中以算法题目为主。我们可以通过解决 LeetCode 题库中的问题来练习编程技能,以及提高算法能力。 LeetCode 上有 道的编程问题,支持 种编程语言(C、C++、Java、Python 等),还有一个活跃的社区,可以用于分享技术话题、职业经历、题目交流等。 并且许多知名互联网公司在面试的时候喜欢考察 LeetCode 题目,通常会以手写代码的形式出现。需要面试者对给定问题进行分析并给出解答,有时还会要求面试者分析算法的时间复杂度和空间复杂度,以及算法思路。面试官通过考察面试者对常用算法的熟悉程度和实现能力来确定面试者解决问题的思维能力水平。 所以无论是面试国内还是国外的知名互联网公司,通过 LeetCode 刷题,充分准备好算法,对拿到一个好公司的好 offer 都是有帮助的。

LeetCode新手注册

1.打开 LeetCode 中文主页,链接:LeetCode 常考的数据结构:数组、字符串、链表、树(如二叉树) 等。 常考的算法:分治算法、贪心算法、穷举算法、回溯算法、动态规划 等

Leecode DAY 1 

1. 两整数相加(2235)

class Solution:
    def sum(self, num1: int, num2: int) -> int:
        return num1 + num2

2、数组串联(1929)

class Solution:
    def getConcatenation(self, nums: List[int]) -> List[int]:
        return nums+nums

3、宝石与石头(771)

class Solution:
    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        mask = 0 
        for c in jewels:
            mask |= 1 << (ord(c) & 63)
        return sum(mask >> (ord(c) & 63) & 1 for c in stones)

4、一维数组的动态和(1480)

class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(1, n):
            nums[i] += nums[i-1]
        return nums

5、转换成小写字母(709)

class Solution:
    def toLowerCase(self, s: str) -> str:
        result = ""
        for i in s:
            if i >= 'A' and i <= 'Z':
                i = chr(ord(i) + 32)
            else:
                pass
            result += i
        return result

6、最富有客户的资产总量(1672)

class Solution:
    def maximumWealth(self, accounts: List[List[int]]) -> int:
        m = 0
        for a in accounts:
            if sum(a)>m:
                m = sum(a)
        return m

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值