- 博客(153)
- 收藏
- 关注
原创 Java分割等和子集(背包问题)
解题思路:该问题相当于能否从数组中挑选出若干个元素, 它们的和等于所有元素总和的一半代表前个数值, 其选择数字总和不超过的最大价值状态转移方程:
2022-07-02 16:47:48 438 1
原创 Java和为k的子数组(前缀和 + 哈希表)
解题思路:首先, 如果第一想法是滑动窗口, 那么, 恭喜, 踩坑如果是正整数、连续子数组, 大概率使用滑动窗口But此题存在负数, 所以就不清楚窗口左右缩进扩张是在增加还是在减少所以此题使用前缀和 + 哈希表的方法由于这位大佬写的实在是太好了, 在此不再赘述, 还是学习这位大佬的解题思路吧: 关于前缀和.........
2022-06-10 11:02:41 322
原创 Java n个骰子
解题思路; 表示个骰子时, 摇到和为的概率 表示摇到骰子的点数 表示一个骰子时, 可能会摇到和为, 所以取, 被摇到的点数概率都为 表示当个骰子里就减去一个的时候, 摇到的和就为从而可以得当有个骰子时:骰子和的取值范围: 骰子和出现的种类: 6n - n + 1 =...
2022-06-07 09:49:25 167
原创 Java打印从1到最大的n位数(大数全排列)
解题思路:一个数的首位肯定不会是0, 所以先确定首位数字, 再确定其他位的数字, 所以需要两个循环表示首位数字表示数字的位数创建一个数组更能直观的表示数组的第一个位置就是这个数的首位, 即, 以此类推, 数组的最后一个位置就是这个数的个位数字如果, 说明这个数字的位数上的各个情况都已遍历完毕, 直接返回即可如果, 开始遍历每个位数上的情况, 直到...
2022-06-05 11:50:22 377
原创 Java丑数
解题思路:使用三指针第一个丑数是, 之后的丑数都是基于前面的丑数分别乘以、、组成的,每次将当前三个丑数中最小的一个添加进数组, 这个最小的丑数是由谁计算的, 谁指针就后移一位注意:使用的是三个不能使用例如丑数为的时候, 既可以由得到, 又可以由得到...
2022-06-05 11:22:49 188
原创 双端队列Deque的常用方法
在队首添加元素在队尾添加元素在队首添加元素, 添加成功返回true在队尾添加元素, 添加成功返回true移除队首元素并返回移除队尾元素并返回移除队首元素并返回移除队尾元素并返回返回队首元素返回队尾元素返回队首元素返回队尾元素...
2022-06-04 11:17:09 384
原创 Java跳跃游戏
剑指offer 55.跳跃游戏解题思路:从后往前遍历即从倒数第二个数开始遍历令最小的步数n = 1如果nums[i] >= n, 那么表示从i开始有能力跳n步, 将n置1, 往前遍历如果nums[i] < n, n++, 继续往前遍历如果遍历到第一个数时, n > 1, 说明nums[i] < n, 即i处的元素没有能力跳n步, 则不能到达最后一个下标结合例子理解更香~class Solution { public boolean canJump(in.
2022-05-31 11:28:35 454
原创 Java剪绳子and圆圈中最后剩下的数字(约瑟夫环)
剑指offer 14-Ⅰ剪绳子解题思路:真的无力吐槽求极点极值这种解题思路我明说了我是废物点心我就只能看懂这种方法观察可知当n > 4时, 3越多, 乘积越多所以显然得出下述解题代码完毕最后对于这种数学题我真的会谢class Solution { public int cuttingRope(int n) { if(n <= 3) return n - 1; int sum = 1; while(n >.
2022-05-30 11:05:08 112
原创 Java在排序数组中查找元素的第一个和最后一个位置(二分法)
34. 在排序数组中查找元素的第一个和最后一个位置解题思路:二分法:数组单调有序时间复杂度O(nlogn)满足上述条件就可以先考虑二分法使用两个二分查找, 一个二分查找左边界, 一个二分查找右边界查找左边界时:当nums[mid] = target时, right = mid - 1;查找右边界时:当nums[mid] = target时, left = mid - 1;为何查找左边界时, 当nums[left] == target直接返回left?处于while.
2022-05-29 11:19:22 1132
原创 Java排序链表
剑指offer 148.排序链表解题思路:由时间复杂度O(nlogn)知道我们可以使用归并排序归并排序经常会出现在合并两个有序链表这样类似的题中定义fast指针和slow指针, 利用fast和slow将链表从中点分为两个链表① 对应操作:slow = slow.next;fast = fast.next.next;此时slow指针刚好停在链表的中点② 将链表从中间断开的操作:slow.next = null;③ 此时左右两个断开的链表的第一个节点分别为head和tmp对.
2022-05-28 16:49:03 3058 2
原创 Java数组中数字出现的次数
剑指offer 56-Ⅰ数组中数字出现的次数class Solution { public int[] singleNumbers(int[] nums) { int x = 0, y = 0, n = 0, m = 1; for(int num : nums){ n ^= num; } while((n & m) == 0){ m <<= 1; .
2022-05-28 11:45:29 318
原创 Java不用加减乘除做加法
剑指offer 65.不用加减乘除做加法加法运算:^: 相当于是无进位求和&:相当于求每位的进位数最终公式: (a^b) ^ ((a&b)<<1)class Solution { public int add(int a, int b) { int sum=a^b; int carry=(a&b)<<1; while(carry!=0){ a=sum; .
2022-05-27 09:55:45 92
原创 Java数值的整数次方(快速幂算法)
剑指offer 16.数值的整数次方解题思路:整活还得是看官方class Solution { public double myPow(double x, int n) { long N = n; return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); } public double quickMul(double x, long N){ if(N == 0){.
2022-05-26 16:54:47 363
原创 Java重建二叉树
剑指offer 07.重建二叉树class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int n = preorder.length; if (n == 0) return null; int rootVal = preorder[0], rootIndex = 0; for (int i = 0; i < n; i++) {.
2022-05-26 16:40:57 220
原创 Java二叉搜索树的后续遍历(递归)
剑指offer 33.二叉搜索树的后序遍历解题思路:1. 二叉搜索树的特点:二叉搜索树中根节点的值大于左子树中的任意一个节点的值,小于右子树中的任意一个节点 的值2. 后序遍历顺序: 左子树–>右子树–>根节点class Solution { public boolean verifyPostorder(int[] postorder) { if(postorder.length < 2) return true; return v.
2022-05-26 16:21:28 228
原创 Java最长连续序列
128. 最长连续序列class Solution { public int longestConsecutive(int[] nums) { Set<Integer> set = new HashSet<>(); for(int x : nums){ set.add(x); } int res = 0; for(int x : set){ .
2022-05-23 11:12:06 245
原创 Java翻转单词顺序
剑指offer 58-Ⅰ翻转单词顺序class Solution { public String reverseWords(String s) { s = s.trim(); int j = s.length() - 1, i = j; StringBuilder sb = new StringBuilder(); while(i >= 0){ while(i >= 0 && .
2022-05-21 11:31:53 257
原创 Java链表中倒数第k个节点、删除链表中倒数第N个节点(快慢指针)
剑指offer 19.删除链表中倒数第N个节点解题思路1:class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode fast = head, slow = head; for(int i = 0; i < n; i++){ fast = fast.next; } if(fast == nul.
2022-05-17 10:57:55 236
原创 Java中的CompareTo()方法
Java中的CompareTo()方法如果参数字符串等于此字符串,则返回值 0如果此字符串小于字符串参数,则返回一个小于 0 的值如果此字符串大于字符串参数,则返回一个大于 0 的值int类型不可直接使用compareTo()方法,需要使用String.valueOf()方法转化为字符串之后进行比较...
2022-05-16 10:29:26 1243
原创 Java动态规划
剑指offer 63.股票的最大利润class Solution { public int maxProfit(int[] prices) { int buy = Integer.MAX_VALUE, maxProfit = 0; for(int price : prices){ buy = Math.min(price, buy); maxProfit = Math.max(maxProfit, price -.
2022-05-15 16:41:00 233
原创 Java树的子结构(递归)
剑指offer 26. 树的子结构class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)); } public boolean.
2022-05-13 09:59:07 297
原创 Java从上到下打印二叉树(层序遍历、广度优先BFS)
剑指offer 32.Ⅰ从上到下打印二叉树class Solution { public int[] levelOrder(TreeNode root) { if(root == null){ return new int[0]; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); Arr.
2022-05-12 21:05:10 217
原创 Ⅱ.0~n - 1中缺失的数字(二分)
剑指offer 53.Ⅱ.0~n - 1中缺失的数字解题思路:有序数组搜索优先选二分法class Solution { public int missingNumber(int[] nums) { int i = 0, j = nums.length - 1; while(i <= j){ int m = (i + j) / 2; if(nums[m] == m){ i.
2022-05-11 11:37:41 92
原创 字母异位词分组
剑指offer 49.字母异位词分组解题思路:对字符串s中的字母进行排序判断map中是否之前存在过这样的字符串若之前存在过这样的字符串, 直接加入到map中若不存在, 在map中新建ArrayList并且将当前遍历的字符串加入进去class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List> map = .
2022-05-09 17:29:26 210
原创 JavaⅡ.左旋转字符串(substirng、列表遍历拼接、字符串遍历拼接)
剑指offer58. Ⅱ.左旋转字符串解题思路1:使用s.substring()方法class Solution { public String reverseLeftWords(String s, int n) { return s.substring(n) + s.substring(0, n); }}解题思路2:列表遍历拼接class Solution { public String reverseLeftWords(String s, i.
2022-05-09 10:30:46 271
原创 Java复杂链表的复制
剑指offer 35.复杂链表的复制class Solution { public Node copyRandomList(Node head) { if(head == null){ return null; } //使cur指向原链表的头节点 Node cur = head; //创建哈希表 //<原链表节点, 新的链表节点> Map<.
2022-05-08 20:41:24 756
原创 下一个排列
剑指offer 31. 下一个排列解题思路:如上图指针i从后往前遍历, 如果nums[i] > nums[i -1], 就将i以及i之后的元素排序操作为Arrays.sort(nums, i, len);终止点是nums[i - 1] = 4, nums[i] =7那么将7以后的元素(即7 6 5 3 1)排序此时的数组为1 5 8 4 1 3 5 6 7此时的i指向4后面的1即nums[i] = 1令指针j指向i的位置, 从此位置开始向后遍历.
2022-05-06 11:15:44 323
原创 Java括号生成(DFS)
剑指offer22. 括号生成解题思路:直接返回的条件:左括号的数量 > n右括号的数量 > n右括号的数量 > 左括号的数量class Solution { List<String> res = new ArrayList<>(); public List<String> generateParenthesis(int n) { if(n <= 0){ return nul.
2022-05-05 21:18:43 587
原创 Java删除链表的倒数第N个结点
19. 删除链表的倒数第N个结点解题思路1:链表的长度len删除链表的倒数第N个结点就是删除链表的第len - N个结点```javaclass Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode tmp = new ListNode(0, head); int len = 0; while(tmp.next != null){ .
2022-04-22 17:34:02 1677
原创 Java四数相加Ⅱ
454. 四数相加Ⅱ解题思路:利用哈希表存储将四个数组两两分为一组先求出nums1和nums2两个数组任意两数之和tmp, 以tmp为key, tmp出现的次数为value, 存入hashmap中再求出nums3和nums4两个数组任意两数之和, 令tmp等于这两数之和的相反数, 在hashmap中查找是否存在key为tmpclass Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nu.
2022-04-22 09:46:05 802
原创 Java乒乓球筐
import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNextLine()){ String s = sc.nextLine(); String[] str = s.split(" "); S...
2022-04-21 11:16:19 441
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人