0
点赞
收藏
分享

微信扫一扫

labuladong算法学习

思考的鸿毛 2022-03-16 阅读 41

一、基础数据结构

1.1 数组/链表

1.1.1 前缀和

前缀和主要适用的场景:原始数组不会被修改的情况下,频繁查询某个区间的累加和。

function prefixSum(nums) {
    var preSum = new Array(nums.length + 1).fill(0);
    for (let i = 1; i <= nums.length; i++) {
        preSum[i] = preSum[i - 1] + nums[i - 1];
    }
    return preSum;
}
function query(preSum, i, j){//[i,..., j]
    return preSum[j+1]-preSum[i];
}

1.1.2 差分数组

查分数组的主要使用场景:频繁对原始数组某个区间进行增减。

注意点:需要判断每次增减的区间,i和j+1增减的时候需要判断。

var diff = new Array(length+1).fill(0);
function difference(nums) {
    diff[0] = nums[0];
    for(let i = 1; i <= nums.length; i++){
        diff[i] = nums[i] - num[i-1];
    }
}
function increment(i, j, inc){
    diff[i] += inc;
    diff[j + 1] -= inc;
}
function result(length, diff) {
    var res = new Array(length).fill(0);
    res[0] = diff[0];
    for (let i = 1; i < res.length; i++) {
        res[i] = res[i - 1] + diff[i];
    }
    return res;
}

1.1.3 快慢指针

快慢指针一般都初始化指向链表的头结点head,前进时快指针fast在前,慢指针slow在后,巧妙解决一些链表中的问题。快指针是fast = fast.next.next,而慢指针是slow = slow.next;

1. 判断链表中是否有环:判断快慢指针是否相遇。

var hasCycle = function(head) {
    var slow = fast = head;
    while(fast != null && fast.next != null){//判断的是fast,因为fast跑得快
        slow = slow.next;
        fast = fast.next.next;
        if(slow == fast)
            return true;
    }
    return false;
};

2. 已知链表中有环,返回这个环的起始位置:当快慢指针相遇时,让其中一个指针指向头节点,再让快慢指针以相同的速度前进,再次相遇时所在的节点位置就是环开始的位置。

不太理解,所以画了一个示意图:(1)此时步数k=``8,慢指针越过了8个节点(k),快指针越过了16个节点(2k). (2)k也为环长度的整数倍,假设相遇点与环起点之间的距离为m,则环起点离head的距离就为k-m,如果从相遇点继续前进k-m步,也恰好到达环起点。

3. 寻找链表的倒数第n个元素:让快指针先走n步,然后快慢指针开始同速前进。这样当快指针走到链表末尾null时,慢指针所在的位置就是倒数第n个链表节点.

var removeNthFromEnd = function(head, n) {
    var slow = fast = head;
    for(let i = 0; i < n; i++){
        fast = fast.next;
    }
    if(fast == null) //如果此时快指针走到头了,说明倒数第n个节点就是第一个节点
        return head.next; //如果直接返回null,可以处理[1] 1,但无法处理[1,2] 2
    while(fast != null && fast.next != null){
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    return head;
};

1.1.4 左右指针

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

举报

相关推荐

A算法学习总结

算法学习笔记

算法学习内容

FRC算法学习

初级算法学习

我的算法学习

acwing spfa算法学习

0 条评论