leetcode
qq_38419093
这个作者很懒,什么都没留下…
展开
-
338. 比特位计数
题目给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。方法一:Brian Kernighan 算法对于任意整数 x,令 x=x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。 public int[] countBits(int n) { int[] res=new int[n+1];原创 2021-07-22 12:22:17 · 90 阅读 · 0 评论 -
231. 2 的幂
题目判断该整数是否是 2 的幂次方方法一:二进制表示n & (n - 1)将二进制表示的最低位 1 移除,n & (-n) 直接获取 n 二进制表示的最低位的 1 public boolean isPowerOfTwo(int n) { return n>0&&(n&(n-1))==0; }复杂度分析时间复杂度:O(1)。空间复杂度:O(1)。...原创 2021-07-22 12:13:59 · 67 阅读 · 0 评论 -
191. 位1的个数
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)方法一:循环检查二进制位检查给定整数 n 的二进制位的每一位是否为 1,让 n与 2^i进行与运算public class Solution { public int hammingWeight(int n) { int ret = 0; for (int i = 0; i < 32; i++) { if原创 2021-07-22 11:56:59 · 54 阅读 · 0 评论 -
79. 单词搜索
题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。方法一:回溯设函数 check(i,j,k) 表示判断以网格的 (i,j) 位置出发,能否搜索到单词 word[k…],从第 k 个字符开始的后缀子串。如果能搜索到,则返回true,反之返回false。visited 数组,用于标识每个位置是否被访问过。class Solution { public boolean exist(char[原创 2021-07-22 11:52:56 · 71 阅读 · 0 评论 -
208. 实现 Trie (前缀树)
题目实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true;否则false 。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一,返回 true ;否则false。每个节点包含以下字段:指向子节点的指针数组 children和布尔字段 isEnd;插入字符原创 2021-07-22 11:35:29 · 60 阅读 · 0 评论 -
69. x 的平方根
题目计算并返回 x 的平方根,其中 x 是非负整数。方法二:二分查找比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围。class Solution { public int mySqrt(int x) { int l=0,r=x,ans=-1; while(l<=r){ int mid=l+(r-l)/2; if((long)mid*mid<=x){原创 2021-07-22 11:12:41 · 62 阅读 · 0 评论 -
37. 解数独
题目编写一个程序,通过填充空格来解决数独问题。方法一:递归递归 + 回溯的方法枚举所有可能的填法。在递归的过程中,如果当前的空白格不能填下任何一个数字,那么就进行回溯。遍历到第 i行第 j列的位置:如果是一个空白格,那么加入一个用来存储空白格位置的列表,方便后续的递归操作;如果该位置是一个数字 x,那么我们需要将 line[i][x−1],column[j][x−1] 以及block[⌊i/3⌋][⌊j/3⌋][x−1] 均置为True。结束了遍历过程之后,开始递归枚举。填入枚举数字x,将三个值都置原创 2021-07-22 10:59:54 · 109 阅读 · 0 评论 -
36. 有效的数独
题目判断一个 9x9 的数独是否有效。只需要根据以下规则 ,验证已经填入的数字是否有效即可。数独部分空格内已填入了数字,空白格用 ‘.’ 表示方法:一次迭代遍历数独。检查看到每个单元格值是否已经在当前的行 / 列 / 子数独中出现过。rows[i].getOrDefault(n,0)当Map集合中有这个key时,就使用这个key对应的value值,如果没有这个key就使用默认值defaultValueclass Solution { public boolean isValidSudok原创 2021-07-21 11:43:25 · 42 阅读 · 0 评论 -
52. N皇后 II
题目给你一个整数 n ,返回 n 皇后问题不同的解决方案的数量。方法一:基于集合的回溯使用三个集合 col、dia1和dia2分别记录每一列以及两个方向的每条斜线上是否有皇后。 public int totalNQueens(int n) { Set<Integer> col=new HashSet<Integer>(); Set<Integer> d1=new HashSet<Integer>();原创 2021-07-21 11:15:31 · 49 阅读 · 0 评论 -
51. N 皇后
题目将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。‘Q’ 和 ‘.’ 分别代表了皇后和空位。方法一:基于集合的回溯使用三个集合col、dia1和 dia2分别记录每一列以及两个方向的每条斜线上是否有皇后。Columns表示为0 到N−1的每一列,方向用斜率表示。具体做法是:使用一个数组记录每行放置的皇后的列下标,依次在每一行放置一个皇后。每次新放置的皇后都不能和已经放置的皇后在同一列以及同一条斜线上,并更新数组中的当前行的皇后列下标。当 N 个皇后都放置完毕,则找到一个可能原创 2021-07-21 11:13:26 · 57 阅读 · 0 评论 -
22. 括号生成
题目数字 n 代表生成括号的对数,设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。方法一:暴力法生成所有 2^{2n}个 ‘(’ 和 ‘)’ 字符构成的序列,然后我们检查每一个是否有效(括号数量是否相等)。public List<String> generateParenthesis(int n) { List<String> com=new ArrayList<String>(); geall(new char[2*n原创 2021-07-21 10:37:49 · 32 阅读 · 0 评论 -
111. 二叉树的最小深度
题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。方法一:深度优先搜索 public int minDepth(TreeNode root) { if(root==null){ return 0; } if(root.left==null&&root.right==null){ return 1; } int m原创 2021-07-14 20:11:07 · 99 阅读 · 0 评论 -
104. 二叉树的最大深度
题目给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。方法一:深度优先搜索左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)+1。 public int maxDepth(TreeNode root) { if(root==null){ return 0; } int a=maxDepth(root.left); int b=maxDept原创 2021-07-14 20:03:29 · 47 阅读 · 0 评论 -
102. 二叉树的层序遍历
题目返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)方法一:广度优先搜索BFS初始化:i=1的时候,队列里面只有 root保持:如果i=k时性质成立,即第 k 轮中出队 s_k的元素是第 k 层的所有元素,并且顺序从左到右。终止:因为该循环不变式是正确的,所以按照这个方法迭代之后每次迭代得到的也就是当前层的层次遍历结果。先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。 public List<List<Integ原创 2021-07-14 19:50:38 · 37 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II
题目给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。方法一:动态规划考虑dp[i][0] 第i天的转移方程:前一天已经没有股票不动,或者前一天有股票,今天卖出。dp[i][0]=max{dp[i−1][0],dp[i−1][1]+prices[i]}前一天已经持有一支股票不动,或者前一天没有股票今天买入。dp[i][1]=max{dp[i−1][1],dp[i−1][0]−prices[i]}初始状态:dp[0原创 2021-07-14 17:33:54 · 41 阅读 · 0 评论 -
169. 多数元素
题目给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。方法一:哈希表键表示一个元素,值表示该元素出现的次数。遍历哈希映射中的所有键值对,返回值最大的键。 private Map<Integer,Integer> countnums(int[] nums){ Map<Integer,Integer> counts=new HashMap<Integer,Integer>();原创 2021-07-14 17:24:56 · 37 阅读 · 0 评论 -
50. Pow(x, n)
题目实现 pow(x, n) ,即计算 x 的 n 次幂函数。方法一:快速幂 + 递归分治法。计算 x^n时,先递归地计算出 y = x^⌊n/2⌋;如果 n为偶数,那么 x^n = y^2x ;如果 n 为奇数,那么 x^n = y^2 。 public double myPow(double x, int n) { long N =n; return N>=0?quick(x,N):1.0/quick(x,-N); } public原创 2021-07-14 17:08:59 · 55 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。方法一:两次遍历p 和 q 的最近公共祖先就是从根节点到它们路径上的「分岔点」,也就是最后一个相同的节点。设从根节点到 p 的路径为数组 path_p,从根节点到 q 的路径为数组 path_q,那么只要找出最大的编号 i,其满足path_p[i]=path_q[i]即可找出对应节点。 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode原创 2021-07-14 16:49:01 · 133 阅读 · 0 评论 -
15. 三数之和
题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组三重循环枚举三元组,还使用哈希表进行去重操作,得到不包含重复三元组的最终答案,需要消耗大量的时间空间。双指针需要枚举的三元组 (a,b,c) 满足a≤b≤c,将数组中的元素从小到大进行排序。保持第二重循环不变,而将第三重循环变成一个从数组最右端开始向左移动的指针「双指针」public List<List<Integer原创 2021-07-06 21:53:01 · 89 阅读 · 0 评论 -
1.两数之和
题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target的那两个整数,并返回它们的数组下标。方法一:暴力枚举 public int[] twoSum(int[] nums, int target) { int n=nums.length; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ int sum=n原创 2021-07-06 21:29:17 · 44 阅读 · 0 评论 -
242. 有效的字母异位词
题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。方法一:排序对字符串 s 和 t 分别排序,判断是否相等。 public boolean isAnagram(String s, String t) { if(s.length()!=t.length()){ return false; } char[] st1=s.toCharArray(); char[] st2=t.t原创 2021-07-06 21:02:25 · 39 阅读 · 0 评论 -
239. 滑动窗口最大值
题目给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。方法一:优先队列(大根堆)在优先队列中存储二元组 (num,index),表示元素 num 在数组中的下标为 index,进行排序。new Comparator<int[]>()1 3 2 4 7 为第0列的所有行2 5 7 9 8 为第1列的所有行return a[0]-b[0] 就是对第0列的原创 2021-07-06 17:34:19 · 44 阅读 · 0 评论 -
703. 数据流中的第 K 大元素
题目设计一个找到数据流中排序后的第 k 大元素的类(class)。方法一:优先队列大小为 k 的优先队列来存储前 k 大的元素,队头为队列中最小的元素,也就是第 k 大的元素。使用整数 k 和整数流 nums 初始化对象。PriorityQueue<Integer> pq; int k; public KthLargest(int k, int[] nums) { this.k=k; pq=new PriorityQueue<In原创 2021-07-06 12:22:49 · 55 阅读 · 0 评论 -
225. 用队列实现栈
题目仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。方法一:两个队列满足队列前端的元素是最后入栈的元素,queue 1于存储栈内的元素,queue 2作为入栈操作的辅助队列。入栈时,将元素入队到queue2,然后将queue 1依次入队到queue 2,再将queue 1和queue 2互换。定义 Queue<Integer> queue1; Queue<Integer> queue2;原创 2021-07-06 12:12:12 · 37 阅读 · 0 评论 -
232. 用栈实现队列
题目仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)定义Deque<Integer> inStack; Deque<Integer> outStack; public MyQueue() { inStack = new LinkedList<Integer>(); outStack = new LinkedList<Integer>();原创 2021-07-06 11:49:28 · 40 阅读 · 0 评论 -
20. 有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。方法一:栈将左括号放入栈顶,右括号用于匹配,取出栈顶元素。使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。在遍历结束后,如果栈中没有左括号,说明我们将字符串 s中的所有左括号闭合,返回True,否则返回False。int n =s.length(); if(n%2==1){ return false; }原创 2021-07-06 11:33:28 · 33 阅读 · 0 评论 -
141. 环形链表
题目给定一个链表,判断链表中是否有环。方法1:哈希表。每次遍历到一个节点时,判断该节点此前是否被访问过,直到我们遍历完整个链表 Set<ListNode> set =new HashSet<ListNode>(); while(head!=null){ if(!set.add(head)){ return true; } head=head.n原创 2021-07-06 11:13:41 · 36 阅读 · 0 评论