LeetCode之最小栈
最小栈1.题目设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。
示例 :
1234567891011121314151617181920输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,null,0,-2]解释:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> ...
LeetCode之相交链表
相交链表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.分析使用双指针,分别以一样的速度走一样长度的路径(A链+B链),看是否会相遇在一个点若没有相交就只会都指向最后的null节点。
3.代码1234567891011121314151617181920/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ...
LeetCode之翻转链表
反转链表1.题目反转一个单链表。
示例:
给定二叉树 [3,9,20,null,null,15,7],
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2.分析这题的目的就是把两节点之间的指向反转
所以可以用双指针一个pre 一个cur ,让cur.next指向pre,再把双指针依次往后挪最后返回即可。
3.代码12345678910111213141516171819202122232425/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val ...
LeetCode之二叉树的最大深度
二叉树的最大深度1.题目给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
2.分析遍历二叉树,先遍历左支再遍历右支,然后比较得出最大深度
3.代码12345678910111213141516171819202122232425/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre ...
LeetCode之翻转二叉树
翻转二叉树1.题目翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出: 4 / 7 2 / \ / 9 6 3 1
2.分析使用深度遍历即可,左右子字点互换即可。
3.代码12345678910111213141516171819202122232425262728/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * ...
LeetCode之合并二叉树
合并二叉树1.题目给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7输出:合并后的树: 3 / 4 5 / \ \ 5 4 7
2.分析使用深度遍历即可,可以new一个根节点也可以直接使用t1返回.显然直接使用t1效率更高和内存消耗更低
3.代码12 ...
LeetCode之子集
子集1.题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
12输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
12输入:nums = [0]输出:[[],[0]]
2.分析
使用回溯法,进行子集枚举。(排列组合子集都可以用到)
3.代码123456789101112131415161718class Solution { List<List<Integer>> ans = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); public List<List<Integer>> subsets(int[] nums) { dfs(0,nums); r ...
LeetCode之最大子序和
最大子序和1.题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
123输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
12输入:nums = [1]输出:1
示例 3:
12输入:nums = [0]输出:0
2.分析
使用动态规划,我们边遍历数组边算出当前的最大和,然后再比较之前的最大和得出最终的最大和
3.代码123456789101112131415class Solution { public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; //dp记录当前最大和 dp[0] = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.length; i ...
LeetCode之删除字符串中的所有相邻重复项
删除字符串中的所有相邻重复项1.题目给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
1234输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
2.分析这题和有效括号类似,可以利用栈先进后出的特性来存储每个字符并判断得出最后结果
3.代码123456789101112131415161718class Solution { public String removeDuplicates(String S) { StringBuffer ...
LeetCode之只出现一次的数字
只出现一次的数字1.题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
12输入: [2,2,1]输出: 1
示例 2:
12输入: [4,1,2,1,2]输出: 4
2.分析
我个人第一时间想到的是先排序再遍历看哪个是单出来的 (时间复杂度太高了)
还有一种是使用hashmap计数然后判断
官方给出的解法 使用异或 (数组中各数异或 最后只会得到不相同的一个)
3.代码
解法1:
1234567891011121314class Solution { public int singleNumber(int[] nums) { int len = nums.length; int ans=0; if(len==1){ ans = nums[0]; }else{ Arrays.sort(nums); boolean flag = fals ...