算法和数据结构之小白(一)
2020-03-23 本文已影响0人
羊驼驼驼驼
算法
前言
从今天开始准备踏上探索算法和数据结构之路~有感兴趣的童鞋可以一起参加哈
给大家推荐两种刷题方式
- 网页:力扣
力扣.png -
编辑器:vscode-leetcode
vscode-leetcode.png
一、为啥要学习算法和数据结构呢?
- 面试:面试官曾给出过这方面的题目,但是自己一脸懵圈,答不出所以然来
- 源码:在日常学习中经常会涉及到一些优秀源码的学习(Vue,React..),需要夯实的基础支撑才能更好的理解
二、算法和数据结构的关系?
算法和数据结构是相辅相成的关系,算法是为了解决某一个问题提出来的解法,数据结构是为了支撑这次解法所提供的一种存储结构,数据结构包括数组、栈(先入后出)、队列(先入先出)、字符串、堆、哈希表、集合...很多很多,但是核心的数据结构只有两种数组和链表,算法包括排序、搜索查找、递归...等等,接下来我们就打开算法小白的第一道题目(两数之和)
三、力扣第一题(两数之和)
1. 题目
题目.png2. 思路
- 暴力-两层循环遍历
外层循环套内层循环,挨个相加看能不能等于目标对象
- 中间变量 一层循环
- 遍历到第一个数字 2 缺少7
- 遍历到第二个数字 7 缺少2
正好遍历到第二个数字就找到了,并不需要两层循环
3. 解法
- 两层循环
var twoSum = function(nums, target) {
for(let i = 0;i<nums.length;i++) {
for(let j = 0;j<nums.length;j++) {
if(nums[i] + nums[j] === target && i !== j) {
return[i,j]
}
}
}
};
点击提交记录里的通过我们可以看一下我们用了多少时间和空间
两层循环.png- 中间变量
var twoSum = function(nums, target) {
let res = {} //需要什么样的对象,需要告诉res
for(let i = 0;i<nums.length;i++) {
let num = nums[i]
// 看看有没有符合你条件的
if(num in res) {
// 找到了
return [res[num],i]
} else {
res[target-num] = i
}
}
};
中间变量.png
4. 复杂度 [ 复杂度:(完成一件事件大概要多少空间,大概要多少时间)]
- 暴力 数组长度为n 两层遍历大概执行次数n*n 时间复杂度 O(n²) 空间复杂度O(1)
- 中间变量 (空间换时间) 一次循环 但是定义了res对象耗费了空间 时间复杂度O(n) 空间复杂度O(n)