算法专栏 - 题集

2020-11-22

算法

资料 1

两数相加

链表的操作

寻找两个正序数组的中位数

两个合并的正序数组,循环一个变量,起始点至两数组长度之和,比较并插入较小的数,最后取得中位数。

最长回文子串

在头尾字符相等的情况下,里面子串的回文性质据定了整个子串的回文性质 dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]

中心扩散 枚举可能出现的回文子串的“中心位置”,从“中心位置”尝试尽可能扩散出去,得到一个回文串。时间复杂度:O(N^{2})

整数反转

//pop operation:
pop = x % 10;
x /= 10;




//push operation:
temp = rev * 10 + pop;
rev = temp;




字符串转换整数 (atoi)

/^[+|-]?\d+/ //正则匹配数字

回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

标准库里如何判断负数 Math.sign() 1, -1, 0, -0, NaN. 代表的各是正数, 负数, 正零, 负零, NaN

反转一半数字 然后对照是否相等 或者 奇数位尾数删除再判断是否相等

   let revertedNumber: number = 0;
    while (x > revertedNumber) {
        revertedNumber = revertedNumber * 10 + x % 10;
        x = Math.floor(x / 10);
    }

盛最多水的容器

取 两个板最小高度*两者之间的距离 记录最大容量

最长公共前缀

纵向扫描

三数之和

首先排序,循环第一个数,定义双指针,大于答案,移动右指针,小于答案,移动左指针。

最接近的三数之和

储存绝对差值,对比。

有效的括号

形成一个栈,入栈{[(,遇到}\)出栈并对比,栈空则正确。

合并两个有序链表

迭代,链表的指针操作。

合并 K 个排序链表

上题包装成函数,n-1 次调用。

删除排序数组中的重复项

遍历,重写当前数组,返回重复次数。

   let i = 0;
    for (let index = 0; index < nums.length; index++) {
        if (nums[i] != nums[index]) {
            i++;
            nums[i] = nums[index];
        }
    }




    return i+1;

搜索旋转排序数组

当左指针小于等于右指针, 取得数组的中位数, 判断 0 到 mid 是否有序, 有序 target 在有序区间内, 让右指针左移. 否则左指针右移. 无序 使用右有序区间,target 在有序区间内, 让左指针右移动, 否则右指针左移动. 最终 中位数与目标值一致, 返回中位. 时间复杂度: O(log n)

字符串相乘

模拟乘法算数

全排列

深度优先 track = function (numArray, crt)

最大子序和

螺旋矩阵

螺旋矩阵 II

旋转链表

不同路径

爬楼梯

始终由前两个状态得到.

子集

合并两个有序数组

格雷编码

二叉树的最大深度

买卖股票的最佳时机

买卖股票的最佳时机 II

二叉树中的最大路径和

只出现一次的数字

位运算 a ^= i

环形链表

环形链表 II

LRU 缓存机制

排序链表

最小栈

相交链表

多数元素

反转链表

数组中的第 K 个最大元素

存在重复元素

二叉搜索树中第 K 小的元素

2 的幂

isPowerOfTwo 位操作 n > 0 && (n & (n-1)) == 0

二叉搜索树的最近公共祖先

二叉树的最近公共祖先

删除链表中的节点

除自身以外数组的乘积

Nim 游戏

反转字符串

反转字符串中的单词 III

copyright ©2019-2024 shenzhen
粤ICP备20041170号-1