leetCode算法题
C位出道_2022
这个作者很懒,什么都没留下…
展开
-
跳盒子,奇数编号盒子可以跳1或2下,偶数编号盒子可以跳1或3下
题目描述:给定m个盒子,将所有的盒子从1到m进行编号,一只青蛙从编号为1的盒子中开始跳,问跳到m个盒子共有多少种跳法输入示例:3输出示例:2输入实例:7输出示例:12递归直接解决: private static int sum = 0; public static void main(String[] args) { int m = 3; hand(7,1); System.out.println(sum.原创 2022-03-12 21:16:38 · 584 阅读 · 0 评论 -
LeetCode剑指 Offer 32 - III. 从上到下打印二叉树 III
这道题比较中规中矩,就是一个BFS,不过有一个每一层输出顺序的问题(第一层从左到右打印,第二层从右到左打印)看代码:public static List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); if (root == null){//根节点空,返回空的list就好了...原创 2022-02-16 10:23:13 · 412 阅读 · 0 评论 -
LeetCode146. LRU 缓存
LRU全称Least Recently Used,表示最近最少使用,第一次听到这个概念是在大三的操作系统课程里面,用于页面置换算法,为虚拟页式存储管理服务。LRU算法的提出基于一个事实,在前面几条指令中使用频繁的页面很可能在接下来的几条指令中也会频繁使用,反过来很久没有使用过的那就认为接下来也不会使用,这就是局部性原理现在LRU算法也经常用作缓存淘汰策略。LeetCode146. LRU 缓存就是这样一道题,据说这也是面试常考的一个点其实如果了解了原理用对了方法就不难了很明显这个缓.原创 2022-02-13 19:18:06 · 612 阅读 · 0 评论 -
leetcode22.括号生成
刚拿到这个题没有头绪,感觉好难啊(自己做题少,经验少)我就死看答案,啥也看不懂!!!后来自己研究,包括查看B站找到了思路刚开始我的思路很乱总想着括号同时从两边添加,左右开弓,这样是很不好思考的思路图解(借的B站的图,我自己画的太丑了):看这个图,n=3,我们发现最下面的元素集合就是我们要的答案,总结一下这个图的思路1.首先每一个符合题目的元素长度都等于 2 * n(递归出口)2.左括号和右括号的数量不能大于n3.左括号的数量小于n就添加左括号4.右括号的数量小于..原创 2022-01-22 21:13:18 · 216 阅读 · 0 评论 -
leetcode70.爬楼梯
我刚看到这道题,有点没有头绪,我想到了可能是动态规划,但是还是没有头绪看了答案知道:我们用 f(x)表示爬到第 x级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子: f(x)=f(x−1)+f(x−2)有了这个规律就真简单了可见对于算法题,一定要先分析题目,当成一个数学题去找思路,对于算法来说更多的是去找规律我们找到了 以上的规律一下子简单起来了可以递归:public static int climbStairs(int n) {/..原创 2022-01-22 15:15:39 · 410 阅读 · 0 评论 -
leetcode53.最大子数组和
这道题我刚开始用暴力法发现很复杂很费劲,就放弃暴力法了。方法一:贪心算法1.准备变量:preSum记录上一次和,curSum记录本次和,maxAns记录最大和2.遍历数组,当上一次计算的和preSum小于0时,另preSum直接等于当前数组元素3.如果preSum大于等于0,curSum =preSum + 当前元素,并给preSum重新赋值为curSum4.每次遍历完一个元素计算maxAns代码: public static int maxSubArray(int...原创 2022-01-20 21:26:14 · 592 阅读 · 0 评论 -
金银铜牌排序问题
题目:奥运会开始了,请你为各个国家和地区作奖牌排序,按照金牌>银牌>铜牌的格式顺序排序输入:第一行 告诉你共有n个国家接下来的n行 每行三个数字 分别代表 金牌数了 银牌数量 铜牌数量 中间用空格隔开输出:输出n行 每行三个数字 按照题意进行排序样例输入:51 2 32 3 41 4 61 4 30 3 4样例输出:2 3 41 4 61 4 31 2 30 3 4思路比较简单优先比较第一列数字,然后比较...原创 2022-01-16 11:13:44 · 1501 阅读 · 0 评论 -
leetcode_538把二叉搜索树转换为累加树
我们知道搜索二叉树也叫有序二叉树每一个节点的左节点值小于当前节点,右节点大于当前节点,简单理解为左小又大,是由顺序的所以叫有序二叉树,因为有顺序方便搜索又叫搜索二叉树这道题虽然中等题但是理解题意就并不难,题意就是将原来的数的每个节点的值换成当前节点本身的值 + 当前节点所有右边子树的值(右边的值比他大)最后就是答案我们只需要反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值,即可得到题目要求的累加树。我在本地写了一个数结构以及搜索树的初始化函数...原创 2022-01-13 17:13:16 · 214 阅读 · 0 评论 -
求一个数组中的唯一数问题
翻看博客的时候看到了这道题,据说是阿里的一次面试题大佬的想法也很巧妙,我在这里又总结了一下题目一:在n个整数中,仅有1个整数出现1次,其余的整数都出现了偶数次,求这个仅出现1次的整数。要求时空复杂度尽可能低。这道题很简单,有经验的一看就知道作异或运算public static int getNum(int[] a){ int n = a.length; int result = 0; for(int i = 0; i < n; i+原创 2022-01-10 23:22:37 · 498 阅读 · 0 评论 -
剑指 Offer II 038. 每日温度
这道题非常好理解,第一反应直接暴力法(时间复杂度On2)双重for循环就可以解决,但是它被列为了一个中等难度的题,所以我认为暴力法可能不会通过,就没写暴力法也没想出太好的解决办法,看了解答区的一个大佬儿的方法,真的很巧妙先上代码:public static void main(String[] args) { int[] temperatures = new int[]{73,74,75,71,69,72,76,73};//模拟输入数据 int len = ..原创 2022-01-09 15:35:33 · 327 阅读 · 0 评论 -
leetcode_1685,有序数组中差绝对值之和
分析题目:非递减,result的每一项当时当前下表对应nums数组的数字与每一位作差的绝对值之和,还是比较好理解的。算法题嘛都是数学题,分析一下怎么作这个数学题简单一些。这里用到了前缀和每次遍历到的数字,以这个数字为中心前后两边分别计算。代码:public int[] getSumAbsoluteDifferences(int[] nums) { int sum = 0; int len = nums.length; int[] pr..原创 2022-01-08 14:49:06 · 728 阅读 · 3 评论 -
判断2的n次方
要求效率尽可能的高,判断一个数是否是2的n次方这道题是非常"典型"的面试题,相信大家都会2的n次方:首先可以直到2的n次方的2进制中只有一个1,拿这个数字减去1是将这个数其他位置变成1,而原本是1的那一位为0,这样两个数作按位与就会等于0public static boolean judge(int n){ if(n==0){ return false; } if((n & (n-1)) == 0){原创 2022-01-07 00:03:51 · 393 阅读 · 0 评论 -
力扣869-重新排列得到2的幂
首先分析题目:前导不为0,也就是不管顺序如何第一个数不是0,也就是给定的数位数是固定的可以先找到紧低于这个位数的2的i次幂的最大值,然后最多乘3次2,就能得到对应位数的虽有2的幂。分别对每一个2的幂与给定的数字每一位数字比较即可。代码: public static void main(String[] args){ int a =8042;//给定的数字 int flag=0;//结果标志 int b = find(digit(a))...原创 2022-01-03 19:24:28 · 515 阅读 · 0 评论 -
力扣476-数字的补数
根据题目要求,我们要把num二进制的每一位取反后输出,但是在计算机的存储过程中并不仅仅是存储有效的二进制位数,例如5的二进制位是101,但是计算机要凑齐特定的位数,在使用32位整数存储时存的是:0000 0000 0000 0000 0000 0000 0000 0101所以我们首先要处理的就是如何找到一个数字二进制的最高位1在第几位找到之后就是各位取反了,取反可以用掩码与原数字亦或运算。掩码就是与原数字相同的位数但是全1,例如5:101,我们可以用111与101亦或,掩码111可以用2^i-...原创 2021-10-18 19:11:39 · 142 阅读 · 0 评论 -
力扣-29两数相除
这道题思路比较简单,但是力扣归为中等肯定有点小陷阱的不让用乘、除和mod运算那就减法呗,反正除法的思想也就是减法 public static int divide(int dividend, int divisor) { if(dividend == Integer.MIN_VALUE && divisor==-1){//溢出时直接返回最大值 return Integer.MAX_VALUE; } int...原创 2021-09-25 18:54:38 · 173 阅读 · 0 评论 -
csp-期末预测之最佳阈值
题目:这个题目相信一看大家都会有思路,当时我也认为很简单,所以就超时了。。。。。。先看我超时的代码:public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[][] arr = new int[n][2]; for (int i = 0; i <.原创 2021-09-17 22:29:25 · 198 阅读 · 0 评论 -
排序--明明的随机数
这道题来自:NOIP全国联赛普及组-2006年NOIP全国联赛普及组这道题不难,就是一个数组排序和去重,但是我没有给数组去重当时想先排序,排序后的结果放入数组然后去重,但是突然感觉好麻烦就没有这么做先看代码public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] arr=new int[n];.原创 2021-09-12 15:46:52 · 99 阅读 · 0 评论 -
二维数组排序
题目描述:给你一个二维数组请按照二维数组的下标0进行排序示例:做这道题首先要理解题意: 什么叫根据二维数组的下标0排序看一个图:通常理解是arr是一个三行两列的数组,其实在计算机中并没有这个概念,依旧是线性存储的二维数组的下标0其实就是第一列元素根据第一列元素的大小然后交换行就ok了代码: public static void main(String[] args) { Scanner c1=new Scan...原创 2021-08-29 20:20:06 · 188 阅读 · 0 评论 -
找到第n个丑数
题目:用例:代码:public static void main(String[] args) { Scanner in =new Scanner(System.in); List elements = new LinkedList(); int i =0; while (in.hasNext()){ int element = in.nextInt(); if(...原创 2021-08-28 18:35:53 · 143 阅读 · 0 评论 -
力扣-1290,二进制链表转整数
分享一个简单的解法:10进制是怎么转化成2进制,我们就怎么逆着转化回来先看代码:public static int getDecimalValue(ListNode head) { ListNode curr = head; int ans = 0; while (curr!=null){ ans = ans*2+curr.val; curr = curr.next; } ...原创 2021-08-23 21:35:49 · 85 阅读 · 0 评论 -
力扣-50,Pow(x,n)
虽然这道题是中等题,但是思路很简单,暴力法代码也很简单法1:暴力法,但是会运行超时public static double myPow(double x, int n) { if(n<0){ x=1/x; n=-n; } double ans = 1; for (int i = 0; i <n ; i++) { ans *= x; ...原创 2021-08-23 21:12:53 · 85 阅读 · 0 评论 -
力扣-20,有效的括号
先看一下我的错误答案吧,少考虑的输入种类用了两个指针这样只靠路的输入条件是从中间开始向两边扩展对称的如 "({[]})" 这样的输入很明显欠考虑了。如 "(){}[]" 这种输入情况没有考虑到public static boolean isValid(String s) { if (s.length()%2==1){//由题可知长度是奇数必定是false return false; } Map<Character..原创 2021-08-23 20:01:55 · 309 阅读 · 0 评论 -
力扣-17,电话号码的字母组合
关键字:所有组合 凡是需要找到所有符合条件的组合 都要用到搜索算法,从所有空间解里找到符合要求的答案常见的搜索算法:深度优先和广度优先这里使用了深度优先搜索: 1.自顶向下的递归实现深度搜索 2.定义子问题 3.在当前递归层结合子问题结果解决原问题方法:回溯首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所...原创 2021-08-23 18:29:52 · 129 阅读 · 0 评论 -
力扣-加一操作
这个题出的不难,但是其实也挺有意思要点:1.逢10进1 2.当遇到9,99,999等数字进1完了还得再开辟一个空间来放最后进的一位数字这道题做出来不难,leetcode也归为简单题,但是有没有最简单巧妙的方法来做呢看代码:这种方法很巧妙 public int[] plusOne(int[] digits) { for (int i = digits.length-1; i >=0 ; i--) { digits[i]++...原创 2021-08-22 21:45:58 · 85 阅读 · 0 评论 -
力扣-两数之和
这个题不难,但是我认为比较经典方法1:暴力法:时间复杂度O(n^2),暴力法就不多说了,很简单public static int[] twoSum1(int[] nums, int target) { int[] answer = new int[2]; for(int i=0;i<nums.length;i++){ answer[0] = i; for(int j=i+1;j<nums.length...原创 2021-08-22 21:38:29 · 73 阅读 · 0 评论 -
力扣-移除元素
这里虽然让返回处理后的数组长度,但是因为String属于引用类型,原地移除内存地址不变,所以还是可以看到改变的数组的,刚开始没看完整题目,没对数组处理。仅仅返回了移除元素后的长度,结果提交错了,发现人家可以看数组的。就不要投机取巧了解法:快慢指针法:public static int removeElement(int[] nums, int val) { int slow=0; for (int fast = 0; fast <nums.len...原创 2021-08-22 18:15:43 · 73 阅读 · 0 评论 -
力扣-压缩字符串
public static int compress(char[] chars) { int curr = 0;//记录写入新字符开始的位置 for (int i = 0; i <chars.length ; ) { int start = i;//记录本次for循环开始的位置 chars[curr] = chars[i]; while (i+1 < chars.length ...原创 2021-08-21 22:02:43 · 81 阅读 · 0 评论 -
力扣-合并两个有序链表
用到三个指针,一个指向合并后链表节点,另外两个分别指向待比较的两个链表的节点 public static ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode prehead = new ListNode(-1);//开头哑节点,链表题常用到 ListNode prev = prehead; while (l1!=null && l2!=null){ ...原创 2021-08-21 21:00:16 · 155 阅读 · 0 评论 -
力扣-四数之和
方法:双指针法 1.首先给数组排序,看代码你会明白为什么要排序 2.因为要四个数,双指针只有两个啊,所以固定两个数,上指针前后移动,依次遍历代码: public List<List<Integer>> fourSum(int[] nums, int target) {if (nums == null || nums.length < 4) return new ArrayList<>(...原创 2021-08-20 22:26:38 · 90 阅读 · 0 评论 -
力扣-盛最多水的容器
解法1:暴力解法(力扣大哥不给通过,时间复杂度O(n^2),耗时太长)public static int maxArea(int[] height) { int len = height.length; int di = 0; int gao = 0; int area = 0; for (int i = 0; i <len ; i++) { for (int j = i+1; j &l...原创 2021-08-19 21:08:02 · 58 阅读 · 0 评论 -
力扣-回文数
我的解法是:整数反转+判断public static boolean isPalindrome(int x) { int num = x; int a = 0; int b = 0; while(x!=0){ b = x%10; //反转溢出肯定不是回文数 if(a>Integer.MAX_VALUE/10||(a==Integer.MAX_VALUE/1...原创 2021-08-19 19:33:00 · 69 阅读 · 0 评论 -
力扣-中心扩散法解最长回文子串问题
中心扩散法: 中心扩散法很好理解,我们遍历字符串的每一个字符,然后以当前字符为中心往两边扩散,查找最长的回文子串 在思考过程中很像当然的把回文子串都想象成奇数个字符的,但其实可以是偶数个的如:"abba"我们可以这样思考,如果是单个字符,我们可以认为他是回文子串,如果是多个字符,并且他们都是相同的,那么他们也是回文串。所以对于上面的问题,我们以当前字符为中心往两边扩散的时候,先要判断和他挨着的有没有相同的字符,如果有,则直...原创 2021-08-17 21:27:25 · 121 阅读 · 0 评论 -
力扣-整数反转
解题:当成一个数学题找解体规律发现公式:a*10+ba是变量,初始值=0,b每次都是当前的最低位传入的实现过程:1.预定义:所给数字 x,返回结果a(初始化=0),当前低位bstep1:当x<>0时,使用取余方式获取当前x的低位,并代入公式 ax10+b(越界问题下面描述)step2:计算出新的a值后,将当前x更新为x/10,以用来下一步进行获取下一个低位值。step3:当x=0时,返回a,结束2.越界问题:因为题目中说明当前系统中无法使用64位存储,也就...原创 2021-08-17 17:46:23 · 121 阅读 · 0 评论 -
力扣-合并两个有序数组
解法一:暴力法public static void merge1(int[] nums1, int m, int[] nums2, int n) { int[] temp= new int[m + n]; int i = 0; int j = 0; int index = 0; while (i<m && j<n){ if(nums1[i]>=nums2[j]...原创 2021-08-17 16:55:08 · 150 阅读 · 0 评论 -
力扣-不含重复字符的最长字串长度
解法1:暴力法:/** * * 这种方法可以做,但是会超时 * @author yuze * @date 2021/8/17 15:03 * @param * @return */ public static int lengthOfLongestSubstring(String s) { int n = s.length(); if (n <= 1) return n; int maxLen = 1; ...原创 2021-08-17 15:47:54 · 249 阅读 · 0 评论