leetcode hot100
小香米团子
hihi,这里是我的学习和刷题记录
展开
-
217. Contains Duplicate
Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.Example 1:Input: nums = [1,2,3,1]Output: trueExample 2:Input: nums = [1,2,3,4]Output: falseExample 3:Input: n原创 2021-11-02 11:03:46 · 48 阅读 · 0 评论 -
leetcode hot100------19. 删除链表的倒数第 N 个结点
如果我们要删除节点 y,我们需要知道节点 y 的前驱节点 x,并将 x 的指针指向 y 的后继节点但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情况即可。两种方法:1.计算长度L,用L-n+1得到正方向这个位置,删掉/*** 获得本链表的长度* @return* @date 2016-9-28* @author shaobn*/public int getLength(){int原创 2021-08-23 12:18:30 · 84 阅读 · 0 评论 -
leetcode hot100------17.电话号码的字母组合
回溯(backtrack):穷举多维度数据的方法,可以想作是多维度的exhaustive search详尽的搜索.大意是:把多维度数据看作是一个多维向量(solution vector),然后运用递回依序递回穷举各个维度的值,制作出所有科恩个数据(solution space),并且在递回途中避免列举出不正确的数据。 backtrack([v1,...,vn]) { //[v1,...,vn]是多维度的向量 //制作出了一组数据,并检验这组数据正不正确 if([v1,...,vn] is we原创 2021-08-19 12:47:19 · 90 阅读 · 0 评论 -
leetcode hot100------15. 三数之和
方法一:排序 + 双指针「不重复」的本质是什么?我们保持三重循环的大框架不变,只需要保证:第二重循环枚举到的元素不小于当前第一重循环枚举到的元素;第三重循环枚举到的元素不小于当前第二重循环枚举到的元素这种方法的时间复杂度仍然为 O(N^3),毕竟我们还是没有跳出三重循环的大框架。然而它是很容易继续优化的,可以发现,如果我们固定了前两重循环枚举到的元素 a和 b,那么只有唯一的 c 满足 a+b+c=0。当第二重循环往后枚举一个元素 b’时,由于 b′>b,那么满足 a+b’+c’=0的 c’原创 2021-08-18 05:07:32 · 119 阅读 · 0 评论 -
leetcode hot100------11. 盛最多水的容器
方法一:双指针说明本题是一道经典的面试题,最优的做法是使用「双指针」。如果读者第一次看到这题,不一定能想出双指针的做法。分析我们先从题目中的示例开始,一步一步地解释双指针算法的过程。稍后再给出算法正确性的证明。题目中的示例为:[1, 8, 6, 2, 5, 4, 8, 3, 7]^ ^在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 min(1, 7) * 8 = 8此时我们需要移动一个指针。移动哪一个呢?直觉告诉我们原创 2021-07-23 15:35:49 · 192 阅读 · 0 评论 -
leetcode hot100------3. 无重复字符的最长子串
方法一:滑动窗口思路和算法我们先用一个例子考虑如何在较优的时间复杂度内通过本题。我们不妨以示例一中的字符串 \texttt{abcabcbb}abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:以 \texttt{(a)bcabcbb}(a)bcabcbb 开始的最长字符串为 \texttt{(abc)abcbb}(abc)abcbb;以 \texttt{a(原创 2021-07-21 00:38:40 · 76 阅读 · 0 评论 -
leetcode hot100------338. 比特位计数
int func(int x){ int count = 0; while(x) { count++; x = x&(x-1); } return count;} 对于任意的x,转换成二进制后,是形如这样的数字:aa…aa10…00,从右向左数有任意多个0,直到遇见第一个1,字母a用来占位,代表1左边的任意数字。x-1转换成二进制后,是形如这样的数字:aa…aa01…11,从右向左数,原来的任意多个0都变成1,原来的原创 2021-07-21 00:12:03 · 95 阅读 · 0 评论 -
leetcode hot100------283. 移动零
swap(nums, left, right);Syntax:public static void swap(List list, int i, int j)Parameters: This method takes the following argument as a Parameterlist – The list in which to swap elements.i – the index of one element to be swapped.j – the index of th原创 2021-07-20 15:54:26 · 38 阅读 · 0 评论 -
leetcode hot100------234. 回文链表
方法一:将值复制到数组中后用双指针法一共为两个步骤:复制链表值到数组列表中。使用双指针法判断是否为回文。第一步,我们需要遍历链表将值复制到数组列表中。我们用 currentNode 指向当前节点。每次迭代向数组添加 currentNode.val,并更新 currentNode = currentNode.next,当 currentNode = null 时停止循环。执行第二步的最佳方法取决于你使用的语言。在 Python 中,很容易构造一个列表的反向副本,也很容易比较两个列表。而在其他语言中,原创 2021-07-20 15:12:05 · 102 阅读 · 0 评论 -
leetcode hot100------155. 最小栈
方法:辅助栈思路要做出这道题目,首先要理解栈结构先进后出的性质。对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。在这之后无论何时,如果栈顶元素是 a,我原创 2021-07-16 16:16:23 · 80 阅读 · 0 评论 -
leetcode hot100------136. 只出现一次的数字---异或运算
异或是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。异或运算:按位异或运算原创 2021-07-14 15:43:13 · 83 阅读 · 0 评论 -
leetcode hot100------121. 买卖股票的最佳时机--动态规划知识点
作者:阮行止链接:https://www.zhihu.com/question/23995189/answer/613096905来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。0. intro很有意思的问题。以往见过许多教材,对动态规划(DP)的引入属于“奉天承运,皇帝诏曰”式:不给出一点引入,见面即拿出一大堆公式吓人;学生则死啃书本,然后突然顿悟。针对入门者的教材不应该是这样的。恰好我给入门者讲过四次DP入门,迭代出了一套比较靠谱的教学方法,所以今天跑过来献丑。转载 2021-07-14 14:53:09 · 127 阅读 · 0 评论 -
leetcode hot100------617. 合并二叉树
深度优先搜索可以使用深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空;如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点;如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并两个节点。对一个节点进行合并之后,还要对该节点的左右子树分别进原创 2021-07-11 11:06:32 · 82 阅读 · 0 评论 -
leetcode hot100------543. 二叉树的直径
分析题目直径长度定义:二叉树直径长度 = 树中任意两结点最短路径的最大值路径长度的定义:两结点之间的路径长度 = 它们之间边的数目友情提示:这条路径可能穿过也可能不穿过根结点$$ 找出二叉树中最长的最短路径1、如何求得两个叶子结点之间的路径长度$两个叶子结点之间路径 = 根结点左右儿子的深度之和2、求出最长路径深度优先搜索递归函数的三个关键点1、子问题与原问题做同样的事2、需要有一个让递归结束的出口3、递归表达式class Solution { //int ans初始化要在原创 2021-07-09 16:27:46 · 69 阅读 · 0 评论 -
leetcode hot100------104. 二叉树的最大深度
如果我们知道了左子树和右子树的最大深度 ll 和 rr,那么该二叉树的最大深度即为 max(l,r)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。class Solution { public int maxDepth(TreeNode root原创 2021-07-09 14:59:18 · 66 阅读 · 0 评论 -
leetcode hot100------94. 二叉树的中序遍历
首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。定义 inorder(root) 表示当前遍历到 \textit{root}root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 \textit{root}root 节点的左子树,然后将 \textit{root}root 节原创 2021-07-09 00:30:16 · 65 阅读 · 0 评论 -
leetcode hot100------448. 找到所有数组中消失的数字
class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { int n = nums.length; //for循环nums遍历 for(int num : nums){ //num-1得到的是List的对应的key,(num-1)%n得到的是key对应的值 int x = (num - 1) % n;原创 2021-07-08 23:56:38 · 62 阅读 · 0 评论 -
leetcode hot100------169. 多数元素-Boyer-Moore 投票算法
方法:Boyer-Moore 投票算法该算法时间复杂度为O(n),空间复杂度为O(1),只需要对原数组进行两趟扫描,并且简单易实现。第一趟扫描我们得到一个候选节点candidate,第二趟扫描我们判断candidate出现的次数是否大于⌊ n/2 ⌋。第一趟扫描中,我们需要记录2个值:candidate,初值可以为任何数count,初值为0之后,对于数组中每一个元素,首先判断count是否为0,若为0,则把candidate设置为当前元素。之后判断candidate是否与当前元素相等,若相等则co原创 2021-07-07 00:46:40 · 82 阅读 · 0 评论 -
leetcode hot100------160. 相交链表
public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //新建一个ListNode用来存放a链表和b链表遍历 Set<ListNode> visited = new HashSet<ListNode>(); //先遍历A链表,不为空的情况下把所有的节点都存进来 ListNode t原创 2021-07-06 17:32:32 · 58 阅读 · 0 评论 -
leetcode hot100------141. 环形链表
一、HashSet实现原理总结HashSet的实现原理总结如下:①是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。②当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSe原创 2021-07-04 12:45:53 · 75 阅读 · 0 评论 -
leetcode hot100------20. 有效的括号
class Solution { public boolean isValid(String s) { int n = s.length(); //如果s的长度是奇数,那么括号肯定不能两两匹配,无效,false if(n%2 == 1){ return false; } //申明一个hash表 //Character C大写 Map<Character, Ch原创 2021-07-03 23:47:56 · 84 阅读 · 0 评论 -
leetcode hot100------2. 两数相加
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head = null,tail = null; //初始化成为哑节点 int carry = 0 ;// 进位是0 while(l1 !=null || l2!= null){ int n1 = l1 != null? l1.val : 0; //如果l2长,l原创 2021-07-03 00:13:02 · 63 阅读 · 0 评论 -
leetcode hot100------1. 两数之和(暴力|哈希)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。一、暴力法class Solution { public i原创 2021-07-02 17:09:02 · 61 阅读 · 0 评论