算法和数据结构之小白(一)

算法

前言

从今天开始准备踏上探索算法和数据结构之路~有感兴趣的童鞋可以一起参加哈
给大家推荐两种刷题方式
  • 网页:力扣
    力扣.png
  • 编辑器:vscode-leetcode


    vscode-leetcode.png
一、为啥要学习算法和数据结构呢?
  • 面试:面试官曾给出过这方面的题目,但是自己一脸懵圈,答不出所以然来
  • 源码:在日常学习中经常会涉及到一些优秀源码的学习(Vue,React..),需要夯实的基础支撑才能更好的理解
二、算法和数据结构的关系?

算法和数据结构是相辅相成的关系,算法是为了解决某一个问题提出来的解法,数据结构是为了支撑这次解法所提供的一种存储结构,数据结构包括数组、栈(先入后出)、队列(先入先出)、字符串、堆、哈希表、集合...很多很多,但是核心的数据结构只有两种数组链表,算法包括排序、搜索查找、递归...等等,接下来我们就打开算法小白的第一道题目(两数之和

三、力扣第一题(两数之和)
1. 题目
题目.png
2. 思路
  • 暴力-两层循环遍历

外层循环套内层循环,挨个相加看能不能等于目标对象

  • 中间变量 一层循环
  1. 遍历到第一个数字 2 缺少7
  2. 遍历到第二个数字 7 缺少2
    正好遍历到第二个数字就找到了,并不需要两层循环
  • 巧用map
  1. 以(key, value)键值对的形式存储
  2. 可用has()判断map中是否存在对应的值
3. 解法
  • 两层循环
var twoSum = function(nums, target) {
    for(let i = 0;i
点击提交记录里的通过我们可以看一下我们用了多少时间和空间
两层循环.png
  • 中间变量
var twoSum = function(nums, target) {
   let res = {} //需要什么样的对象,需要告诉res
   for(let i = 0;i
中间变量.png
  • map
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const mapObj = new Map()
    for(let i = 0;  i < nums.length; i++) {
        const another = target - nums[i]
        if(mapObj.has(another)) {
            return [mapObj.get(another), i]
        }
        mapObj.set(nums[i], i)
    }
};

map.png
4. 复杂度 [ 复杂度:(完成一件事件大概要多少空间,大概要多少时间)]
  • 暴力 数组长度为n 两层遍历大概执行次数n*n 时间复杂度 O(n²) 空间复杂度O(1)
  • 中间变量 (空间换时间) 一次循环 但是定义了res对象耗费了空间 时间复杂度O(n) 空间复杂度O(n)
  • map (空间换时间)利用Map结构特性 所有事情在一次遍历中完成 时间复杂度O(n) 空间复杂度O(n)
第一题两数之和完成,大家如果有更好的思路和想法欢迎在下方评论写出,共同学习,共同进步,加油~
学习学习

你可能感兴趣的:(算法和数据结构之小白(一))