买卖股票的最佳时机算法概述原题
本题要求为在给出数组中找出两个差值最大的元素。就是拿两个临时变量存当前的最小值和最大差值,然后 动态更新 它俩。
时间复杂度为O(n)
空间复杂度为O(1)
JAVA123456789101112131415public class Solution { public int maxProfit(int prices[]) { ...
数组中的第K个最大元素算法概述原题
本题要求为返回数组中的第K个最大元素。栈也可以实现。如果需要频繁插入和查询,就用 堆排 ,保持顺序就用栈。
时间复杂度为O(nlogn):建堆需要O(n),总删除需要O(klogn),最后应该是O(n+klogn),但k小于n,大概是这么多
空间复杂度为O(logn):函数栈
JAVA123456789101112131415161718192021...
有效的括号算法概述原题
本题要求为判断输入的括号组成的字符串是否有效。所有字符遍历,一半字符串入栈, ***另外一半与此时栈内的进行匹配 ***。
时间复杂度为O(n)
空间复杂度为O(n+∑):栈(原字符)和哈希表(字符集)
JAVA1234567891011121314151617181920212223242526272829303132class Solution {...
搜索插入位置算法概述原题
本题要求为找到相应目标值或者返回将其顺序插入的位置。使用二分查找。
时间复杂度为O(logn):二分查找
空间复杂度为O(1):临时变量
JAVA1234567891011121314151617class Solution { public int searchInsert(int[] nums, int target) { ...
全排列算法概述原题
本题要求为给出目标数组的所有排列可能。使用 n!回溯 。
时间复杂度为O(n×n!):需要固定的元素数量,以及它们的回溯
空间复杂度为O(n):栈
JAVA1234567891011121314151617181920212223242526class Solution { public List<List<Integer>>...
岛屿数量算法概述原题
本题要求为计数给出矩阵中有多少个岛屿(连在一起的1)。dfs和bfs的基础实现。
时间复杂度为O(mn):全部遍历一次
空间复杂度为O(mn):隐式栈或显式栈或队列
JAVA123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525...
二叉树的中序遍历算法概述原题
本题要求为中序遍历。三种解法: 递归 , 迭代 , Morris 。对于递归:
时间复杂度为O(n):全部遍历一次
空间复杂度为O(n):隐式的栈空间对于迭代:
时间复杂度为O(n)
空间复杂度为O(n):双向队列实现栈,只是变得显式对于Morris:
时间复杂度为O(n)
空间复杂度为O(1):通过判断左节点的情况,和将右节点与根节点相连接等算法,避免栈
...
相交链表算法概述原题
题目要求为找到两个链表中相交的元素(存储位置需要相对链表末尾相同,也就是从后往前数有几个节点)。我的想法是尽可能节约时间复杂度,我一开始想的是遍历到末尾再回头遍历,其实和这个方案得到的时间复杂度是一样的,但是我以为还有其他办法。但实际上是必须要这么多次遍历才够的。也就是要用双指针进行同时遍历,不过不是到末尾返回,而是 到对方的链表中继续遍历 。
时间复杂度为O(n+...
矩阵置零算法概述原题
题目要求为将矩阵中0元素的同行同列都转化为0。避免不了矩阵每个元素都要遍历一次,没有什么优化空间,但是空间复杂度上可以通过使用矩阵内部的空间用以标记减少空间消耗。在这里,使用了第一行第一列作为需要置零的行列标记,但实际上第一行置零与否也被包含在第一列的标记内,所以只需创造标记之后,将对第一行的遍历放在最后(第一行是否需要遍历只看[0][0]),第一列是否置零用另外的标...
最大子数组和算法概述原题
此题要求为找到最大的子数组的和。因为这个题目只要求一个最终的和,所以完全不需要双指针和滑动窗口这样相对负责的结构,简单的dp(动态规划)就能做出来。
时间复杂度为O(n):遍历一次
空间复杂度为O(1):只需要存储中间常数
JAVA123456789101112class Solution { public int maxSubArray(in...