自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 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 84

原创 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 63

原创 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 51

原创 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 63

原创 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 58

原创 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 56

原创 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 107

原创 36. 有效的数独

题目判断一个 9x9 的数独是否有效。只需要根据以下规则 ,验证已经填入的数字是否有效即可。数独部分空格内已填入了数字,空白格用 ‘.’ 表示方法:一次迭代遍历数独。检查看到每个单元格值是否已经在当前的行 / 列 / 子数独中出现过。rows[i].getOrDefault(n,0)当Map集合中有这个key时,就使用这个key对应的value值,如果没有这个key就使用默认值defaultValueclass Solution { public boolean isValidSudok

2021-07-21 11:43:25 40

原创 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 46

原创 51. N 皇后

题目将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。‘Q’ 和 ‘.’ 分别代表了皇后和空位。方法一:基于集合的回溯使用三个集合col、dia1和 dia2分别记录每一列以及两个方向的每条斜线上是否有皇后。Columns表示为0 到N−1的每一列,方向用斜率表示。具体做法是:使用一个数组记录每行放置的皇后的列下标,依次在每一行放置一个皇后。每次新放置的皇后都不能和已经放置的皇后在同一列以及同一条斜线上,并更新数组中的当前行的皇后列下标。当 N 个皇后都放置完毕,则找到一个可能

2021-07-21 11:13:26 54

原创 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 30

原创 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 98

原创 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 42

原创 102. 二叉树的层序遍历

题目返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)方法一:广度优先搜索BFS初始化:i=1的时候,队列里面只有 root保持:如果i=k时性质成立,即第 k 轮中出队 s_k的元素是第 k 层的所有元素,并且顺序从左到右。终止:因为该循环不变式是正确的,所以按照这个方法迭代之后每次迭代得到的也就是当前层的层次遍历结果。先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。 public List<List<Integ

2021-07-14 19:50:38 35

原创 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 40

原创 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 36

原创 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 52

原创 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 131

原创 98. 验证二叉搜索树

题目给定一个二叉树,判断其是否是一个有效的二叉搜索树。满足以下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。方法一: 递归设计一个递归函数 helper(root, lower, upper) 来递归判断public boolean isValidBST(TreeNode root) { return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE);

2021-07-14 16:30:33 34

原创 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 84

原创 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 41

原创 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 37

原创 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 42

原创 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 52

原创 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 36

原创 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 37

原创 20. 有效的括号

题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。方法一:栈将左括号放入栈顶,右括号用于匹配,取出栈顶元素。使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。在遍历结束后,如果栈中没有左括号,说明我们将字符串 s中的所有左括号闭合,返回True,否则返回False。int n =s.length(); if(n%2==1){ return false; }

2021-07-06 11:33:28 31

原创 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 35

原创 24. 两两交换链表中的节点

题目给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。官方方法1递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。两两交换链表中的节点,原始链表的head变成新的链表的第二个节点,原始链表的第二个节点变成newHead。链表中的其余节点的两两交换swapPairs可以递归地实现,再更新节点之间的指针关系。public ListNode swapPairs(ListNode head) { i

2021-07-02 22:19:44 60 1

原创 206. 反转链表

题目给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。思考假设链表为1→2→3→∅,变成 ∅←1←2←3。在遍历链表时,将当前节点的next 指针改为指向前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。public ListNode reverseList(ListNode head) { while(head==null){ return null; } ListNode cur=hea

2021-07-02 21:44:10 33

原创 剑指 Offer 09. 用两个栈实现队列

题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )双栈维护两个栈,stack1支持插入操作,stack2支持删除操作。初始化为空。stack1插入元素,若要删除元素,则判断stack2是否为空,若空则将stack1内所有元素弹出插入到stack2中,从stack2中弹出一个元素并返回。class CQueue { De

2021-07-02 21:22:16 32

转载 剑指 Offer 07. 重建二叉树

题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]二叉树遍历顺序二叉树前序遍历的顺序为:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]先遍历根节点;随后递归地遍历左子树;最后递归地遍历右子树。二叉树中序遍历的顺序为:[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]先递

2021-07-02 20:57:35 34

原创 剑指 Offer 17. 打印从1到最大的n位数

题目输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。解题思路题目要求打印 “从 1 至最大的 n 位数的列表” ,因此需考虑以下两个问题:最大的 n 位数(记为 end )和位数 n 的关系为指数关系;大数越界问题,但是本题返回都为int。 public int[] printNumbers(int n) { int end =(int)Math.pow(10,n)-1; int[]

2021-04-21 22:12:21 22

原创 剑指 Offer 16. 数值的整数次方

题目实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。不得使用库函数,同时不需要考虑大数问题。解题思路求 x^n最简单的方法是通过循环将 n 个 x 乘起来,依次求 x^1, x^2, …, x^{n-1}, x^n,时间复杂度为 O(n)。快速幂法:可将时间复杂度降低至 O(log_2 n),以下从 “二分法” 和 “二进制” 两个角度解析快速幂法。快速幂解析(二进制角度):利用十进制数字 n 的二进制表示,可对快速幂进行数学化解释。获取二进制各位值,循环执行以下操作即可

2021-04-21 22:10:56 33

原创 剑指 Offer 15. 二进制中1的个数

题目请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。解题思路方法一:逐位判断根据 与运算 定义,设二进制数字 n ,则有:若n&1=0 ,则 n 二进制 最右一位 为 0 ;若n&1=1 ,则 n 二进制 最右一位 为 1根据以上特点,考虑以下循环判断 :判断 n 最右一位是否为 1 ,根据结果计数。将 n 右移一位(本题要求把数字 n 看作无符

2021-04-21 22:00:54 29

原创 剑指 Offer 14- II. 剪绳子

题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题思路此题与 面试题14- I. 剪绳子 主体等价,不同之处在于“大数

2021-04-20 17:38:26 48

原创 剑指 Offer 13. 机器人的运动范围

题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?方法1:广度优先搜索先计算一个数的数位之和,在搜索的过程中搜索方向可以缩减为向右和向下复杂

2021-04-20 17:34:06 33

原创 剑指 Offer 12. 矩阵中的路径

题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解题思路本问题是典型的矩阵搜索问题,可使用 深度优先搜索(DFS)+ 剪枝 解决。深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另

2021-04-18 21:26:03 44

原创 剑指 Offer 11. 旋转数组的最小数字

题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。解题思路考虑数组中的最后一个元素 x:在最小值右侧的元素,它们的值一定都小于等于 x;而在最小值左侧的元素,它们的值一定都大于等于 x。因此,我们可以根据这一条性质,通过二分查找的方法找出最小值。在二分查找的每一步中,左边界为 low,右边界为high,区间的中点为 pivot,

2021-04-18 21:22:20 25

原创 剑指 Offer 47. 礼物的最大价值

题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?解题思路:题目说明:从棋盘的左上角开始拿格子里的礼物,并每次 向右 或者 向下 移动一格、直到到达棋盘的右下角。根据题目说明,易得某单元格只可能从上边单元格或左边单元格到达。可用动态规划解决此问题,转移方程如下f(i,j)=max[f(i,j−1),f

2021-04-13 21:05:02 33

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除