刷leetcode算法的记录
- 在计算机科学中,数据结构是计算机中存储、组织数据的方式
- 正确的数据结构选择可以提高算法的效率。
- 在计算机程序设计的过程中,选择适当的数据结构是一项重要工作。
- 许多大型系统的编写经验显示,程序设计的困难成都与最终成果的质量与表现,取决于是否选择了最适合的数据结构
217.存在重复元素
给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回true。 如果数组中每个元素都不相同,则返回false。
【解题思路】:HashMap一次循环
53.最大子序和
给定一个整数数组nums, 找到一个具有最大和的连续子数组(子数组最少包含一个元素), 返回其最大和。
【解题思路】:动态规划
- 1.两数之和
【题目描述】给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 - 88.合并两个有序数组
【题目描述】给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。 初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1的空间大小等于m+n,这样它就有足够的空间保存来自nums2的元素。
- 350.两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。 - 121.买卖股票的最佳时机
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。
- 566.重塑矩阵
【题目描述】在MATLAB中,有一个非常有用的函数reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。 重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。 如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。 - 118.杨辉三角
【题目描述】给定一个非负整数numRows,生成杨辉三角的前numRows行。 在杨辉三角中,每个数是它左上方和右上方的数的和。
-
36.有效的数独
请你判断一个9*9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。- 数字1-9在每一行只能出现一次。
- 数字1-9在每一列只能出现一次。
- 数字1-9在每一个以粗实线分隔的3*3宫内只能出现一次。
数独部分空格内已填入数字,空白格用'.'表示
-
73.矩阵置零
给定一个m*n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。
进阶:- 一个直观的解决方案是使用O(mn)的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用O(m+n)的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个仅使用常量空间的解决方案吗?
-
387.字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回-1。假定该字符串只包含小写字母。 -
383.赎金信
给定一个赎金信(ransom)字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。 如果可以构成,返回true;否则,返回false。 为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单次来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。 -
242.有效的字母异位词
给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。 若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。
-
141.环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个结点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。 如果pos是-1,则在该链表中没有环。 【注意】pos不作为参数传递,仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回false。否则,返回false。 【进阶】你能用O(1)内存解决此问题吗? -
21.合并两个有序链表
将两个升序链表合并成为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。 -
203.移除链表元素
给你一个链表的头结点head和一个整数val,请你删除表中所有满足 Node.val == val 的结点,并返回新的头结点。
-
206.反转链表
给你单链表的头结点head,请你反转链表,并返回反转后的链表。 -
83.删除排序链表中的重复元素
存在一个按升序排列的链表,给你这个链表的头结点head,请你删除所有重复的元素, 使得元素只出现一次。返回同样按升序排列的结果链表。
-
20.有效的括号
给定一个只包括 '(', ')', '{', '}', '[', ']'的字符串s,判断字符串是否有效。 有效字符串满足:- 1.左括号必须用相同类型的右括号闭合。
- 2.左括号必须以正确的顺序闭合。
-
232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true;否则,返回 false
说明:
- 你只能使用标准的栈操作——也就是只有 push to top,peek/pop from top,size和 is empty 操作是合法的
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
进阶:
- 你能否实现每个操作均摊时间复杂度为O(1)的队列?换句话说,执行n个操作的总时间复杂度是O(n),即使其中一个操作可能花费较长时间。