160. 相交链表/面试题52. 两个链表的第一个公共节点(简单)
160. 相交链表/面试题52. 两个链表的第一个公共节点(简单)编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
示例 2:
输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。 ...
155. 最小栈/面试题30. 包含min函数的栈(简单)
155. 最小栈/面试题30. 包含min函数的栈(简单)设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
示例:12345678MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.minStack.getMin(); --> 返回 -2.
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/min-stack
思路:使用辅助栈,栈1正常栈,栈2只push每次最小的,如果没有就不push,pop时,如果栈1pop的和栈2一样,那 ...
154. 寻找旋转排序数组中的最小值 II/面试题11. 旋转数组的最小数字(一般)
154. 寻找旋转排序数组中的最小值 II/面试题11. 旋转数组的最小数字(一般)假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:输入: [1,3,5]输出: 1
示例 2:输入: [2,2,2,0,1]输出: 0
说明:这道题是 寻找旋转排序数组中的最小值 的延伸题目。允许重复会影响算法的时间复杂度吗?会如何影响,为什么?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii
思路:思路是二分查找的扩展思想,如果中间比右边大,则旋转点一定正在数组后面,否则一定在数组前面,当出现类似(1,1,1,1,0,0,1,1)这类情况无法进行左右甄别,随机选择一边进行抉择,比如选前半部分,如果mid的值和最左的值相等,则每次将high向前移动一位,不等的话可以选择直接将high = mid
参考题 ...
151. 翻转字符串里的单词/面试题58 - I. 翻转单词顺序(一般)
151. 翻转字符串里的单词/面试题58 - I. 翻转单词顺序(一般)(只有正则,其他没写)输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。
示例 1:输入: “the sky is blue”输出: “blue is sky the”
示例 2:输入: “ hello world! “输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:输入: “a good example”输出: “example good a”解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/f ...
141. 环形链表(简单)
141. 环形链表(简单)给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:输入:head = [1], pos = -1输出:false解释:链表中没有环。
进阶:你能用 O(1)(即,常量)内存解决此问题吗?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-cycle
思路:这题依旧使用链表常用解法,快慢指针,如果快指针直接指向null则无环,如果某一时刻快指针和慢指针重合,就有环,使用该方法好处是不用额外的空间O(1),而使用集合存储元素时,有重复的就代表有环,空间代价为O(n)
代码:12345678910111 ...
138. 复制带随机指针的链表/面试题35. 复杂链表的复制(一般)
138. 复制带随机指针的链表/面试题35. 复杂链表的复制(一般)给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
示例 1:
12输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
12输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]
示例 3:
12输入:head = [[3,null],[3,0],[3,null]]输出:[[3,null],[3,0],[3,null]]
示例 4:
123输入:he ...
137. 只出现一次的数字 II/面试题56 - II. 数组中数字出现的次数 II(较难)
137. 只出现一次的数字 II/面试题56 - II. 数组中数字出现的次数 II(较难)给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:输入: [2,2,3,2]输出: 3
示例 2:输入: [0,1,0,1,0,1,99]输出: 99
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/single-number-ii
说明leetcode137与offer的不是特别一样,但代码都可以跑起来,leetcode要求不使用额外空间,其实也就是状态机,位运算的方式,后面来补(200519)
思路1:
如果一个数字出现三次,则它二进制表示的每一位也出现三次。
如果把所有出现三次的数字的二进制表示的每一位都分别加起来,则每一位的和都能被3整除。
将数组中的所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,
则只出现一次数字的二进制表示中对应的那一位是0,否则就是1。
作者:l ...
136. 只出现一次的数字(简单)
136. 只出现一次的数字(简单)给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:输入: [2,2,1]输出: 1
示例 2:输入: [4,1,2,1,2]输出: 4
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/single-number
思路1:
任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
思路2:其他解法:set,hash空间复杂度高
代码1:123456789class Solution { public int singleNumber(int[] nums) { int res = 0; for(int num:nums){ res ...
124. 二叉树中的最大路径和(一般)
124. 二叉树中的最大路径和(一般)给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:1234输入: [1,2,3] 1 / \ 2 3
输出: 6
示例 2:1234567输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7
输出: 42
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
思路:递归遍历二叉树思想,通用的,有点难
https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-ikaruga/
代码:12345678910111213141516171819202122 ...
122. 买卖股票的最佳时机 II(简单)
122. 买卖股票的最佳时机 II(简单)给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:输入:[7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:输入: [1,2,3,4,5]输出: 4解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:输入: [7,6,4,3 ...