LeetCode之合并两个有序数组
合并两个有序数组1.题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素
示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例:
12输入:nums1 = [1], m = 1, nums2 = [], n = 0输出:[1]
2.分析
直接合并排序
使用的双指针方法,但是时间复杂度有点高了
双指针优化
3.代码123456789101112131415161718192021222324class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] te ...
LeetCode之括号的生成
括号生成1.题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例:
12输入:n = 1输出:["()"]
2.分析使用dfs,注意需要判断左右括号是否小于0了,否则就会递归到死!
3.代码123456789101112131415161718192021222324252627class Solution { public List<String> generateParenthesis(int n) { List<String> ans = new ArrayList<>(); getKH(ans, "", n, n); return ans; ...
LeetCode之全排列
全排列1.题目给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
2.分析使用dfs进行全排列,注意一定要回溯的时候移除之前的数!
3.代码12345678910111213141516171819202122class Solution { private List<List<Integer>> ans = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { List<Integer> temp = new ArrayList<>(); dfs(nums,temp); return ans; } private void dfs(int[] ...
LeetCode之比特位计数
比特位计数1.题目给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例:
输入: 2
输出: [0,1,1]
示例 2:
12输入: 5输出: [0,1,1,2,1,2]
2.分析这里偷个懒直接用java类库
3.代码123456789class Solution { public int[] countBits(int num) { int[] arr = new int[num+1]; for (int i = 0; i <= num; i++) { arr[i] = Integer.bitCount(i); } return arr; }}
LeetCode之回文链表
回文链表1.题目请判断一个链表是否为回文链表。
示例:
输入: 1->2
输出: false
示例 2:
12输入: 1->2->2->1输出: true
2.分析使用递归,递归的归刚好反向的,就回溯的过程中从前往后对比。
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 = val; this.next = next; } * } */class Solution { ListNode temp=n ...
LeetCode之二叉树的直径
二叉树的直径1.题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例:
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
2.分析使用递归分别遍历左右子树,计算出最大深度,再相加更新ans并返回。
3.代码1234567891011121314151617181920212223242526272829303132/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; ...
LeetCode之环形链表
环形链表1.题目给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
示例:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
2.分析使用快慢双指针,先判断是否为空链表和只有一个节点若是直接返回false,再用快指针去追慢指针,如果有环一定会相遇,反之不会
3.代码12345678910111213141516171819202122232425262728/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * Li ...
LeetCode之对称二叉树
对称二叉树1.题目给定一个二叉树,检查它是否是镜像对称的。
示例:
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
12345 1 / \2 2 \ \ 3 3
2.分析使用递归,先将完整的二叉树分成两个小的左右单独的树进行递归对比,如果左右子树都为空说明对称返回true,若一边为空一边不为空则返回false说明不对称,若节点的值不相同也返回false,最重要的是注意:因为要求镜像对称所以左子树的左节点要和右子树的右节点进行对比,左子树的右节点要和右子树的左节点进行对比!
3.代码1234567891011121314151617181920212223242526272829303132/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode l ...
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 ...