随笔分类 -  Java刷题从1开始

摘要:简介 单调栈即为有序栈,分为单调递增和单调递减。 最大好处是时间复杂度是线性的,每个元素遍历一次 实现伪代码 stack<int> st; for (遍历这个数组) { if (栈空 || 栈顶元素大于等于当前比较元素) { 入栈; } else { while (栈不为空 && 栈顶元素小于当前元 阅读全文
posted @ 2022-03-04 16:54 zjcfrancis 阅读(95) 评论(0) 推荐(0) 编辑
摘要:题目描述 人的视力不能看到掩体之后的事物,在一场战争中,我们希望对方尽可能的低估我方的战斗力这样才能出其不意。 某个军事参谋效仿孙膑,把某些小规模队隐藏在大规模部队中,这样,就使得军队数量看起来变少了。已知,如果某部队A的人数小于等于另一支部队B人数的1/3, 则可以将A藏于B中,且不被人发现。不支 阅读全文
posted @ 2021-04-10 22:34 zjcfrancis 阅读(401) 评论(0) 推荐(0) 编辑
摘要:思路:dfs 这道题由于开始和结束可以为任意节点,因此这里树是被当作无向图来搜索路径的,而不是以前的有向图。 因此 dfs 的返回值要定义为以自己为根,从根节点到子节点的一条最长路径。 具体实现是寻找左子树与右子树中的一条最长路径,比较取最长。 而总的最长路径则为左子树最长路径 加右子树最长路径 加 阅读全文
posted @ 2021-03-10 00:42 zjcfrancis 阅读(273) 评论(0) 推荐(0) 编辑
摘要:思路: 设置三个指针,cur 指向当前节点, pre 指向上一节点,tmp 指向下一节点。 一开始 cur 指向头节点,pre 与 tmp 置null(可以将其视作循环链表,则 pre 为头节点的上一节点) 遍历链表时,cur 移向下一节点,cur.next 指向上一节点 pre,实现链表反转。 代 阅读全文
posted @ 2021-03-09 19:09 zjcfrancis 阅读(45) 评论(0) 推荐(0) 编辑
摘要:思路:dfs 每条根节点到叶子节点的路径都用一个数字代替,即每向下一个节点,之前的数字都左移一位。 通过dfs找到左右子树所有路径,最后回溯求和。 代码: import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNo 阅读全文
posted @ 2021-03-09 12:10 zjcfrancis 阅读(840) 评论(0) 推荐(0) 编辑
摘要:思路: 创建两个链表 head1、head2 ,遍历原链表,将大于 x 的节点链接至链表 head1,小于 x 的节点链接至链表 head2。 再将链表 head1与 head2链接到一起即可。 import java.util.*; /* * public class ListNode { * i 阅读全文
posted @ 2021-03-09 08:07 zjcfrancis 阅读(105) 评论(0) 推荐(0) 编辑
摘要:两种方法: 1. 加减 a = a + b; b = a - b; a = a - b; 2. 异或(位)运算 a = a^b; b = a^b;//此时b = a^b^b,因此b = a(交换前的a与b) a = a^b;//此时相当于a^b^a,由异或的交换律得a = b ^a ^a,因此a = 阅读全文
posted @ 2021-03-08 23:17 zjcfrancis 阅读(114) 评论(0) 推荐(0) 编辑
摘要:思路: 快慢指针 快指针一次两步,慢指针一次一步,如果链表中有环,则快指针必会与慢指针相遇。如果无环,则快指针会先指向 null,返回 null 即可。 当他们相遇时,如下图所示。从起点到环的入口节点长度为 a,入口节点到快慢指针相遇点为 X,X到环入口节点的长度为 c。 相遇时,快指针走了2(a+ 阅读全文
posted @ 2021-03-08 22:57 zjcfrancis 阅读(100) 评论(0) 推荐(0) 编辑
摘要:思路1:二次遍历(暴力法) 第一次遍历链表得到链表长,第二次遍历链表以从数组末端开始往前加入链表。 代码: 时间复杂度O(n),空间复杂度O(1) /** * Definition for singly-linked list. * public class ListNode { * int val 阅读全文
posted @ 2021-03-02 00:25 zjcfrancis 阅读(36) 评论(0) 推荐(0) 编辑
摘要:题目的大意是NumArray方法初始化数组,sumRange求一个区间内的数字和 其中sumRange方法会被多次调用,因此要想出一个降低其时间复杂度的求和算法。 思路:前缀和 前缀和,即数组中第i个元素及其之前元素的和。 sumRange(i,j)等于 j 的前缀和 减去 i-1 的前缀和 在此题 阅读全文
posted @ 2021-03-01 21:50 zjcfrancis 阅读(36) 评论(0) 推荐(0) 编辑
摘要:思路:找规律 数字范围 数字位数 数字数量 数位数量 0-9 1 10 10 10-99 2 90 180 100-999 3 900 2700 …… …… …… …… start-end digit 9*start 9*start*digit 由此,要得到第n位对应的数字,需要分三步: 1. 确定 阅读全文
posted @ 2021-02-28 23:55 zjcfrancis 阅读(55) 评论(0) 推荐(0) 编辑
摘要:思路:层次遍历 序列化: 层次遍历二叉树,注意输出符合题目要求的格式 反序列化: 初始化时除去序列化数组的左右中括号,除去逗号,将其转换成一个 String 数组 这样二叉树中每个节点的索引即为数组的下标 按序列化层次遍历的思路,一层一层构建原二叉树。 代码: 序列化与反序列化的时间复杂度均为O(n 阅读全文
posted @ 2021-02-28 23:18 zjcfrancis 阅读(64) 评论(0) 推荐(0) 编辑
摘要:思路:动态规划 对于数组B中元素B[i],它的值等于A数组中 i 左侧元素乘积,与 i 右侧元素乘积 的乘积 画表可知: B[1]= 1* A[2]* A[3]* A[4] B[2]= A[1]* 1* A[3]* A[4] B[3]= A[1]* A[2]* 1* A[4] B[4]= A[1]* 阅读全文
posted @ 2021-02-28 18:03 zjcfrancis 阅读(28) 评论(0) 推荐(0) 编辑
摘要:思路1:滑动窗口 设置一个滑动窗口与一个HashSet,用set来维护一个不重复的窗口。 即当窗口右边界遇到窗口内重复的字符时,左边界移动至右边界处。 res保存最大窗口大小,即为最长无重复字符的字串长度。 代码: class Solution { public int lengthOfLonges 阅读全文
posted @ 2021-02-28 17:01 zjcfrancis 阅读(45) 评论(0) 推荐(0) 编辑
摘要:思路: 设置两个布尔变量 increase、decrease。 当数组中存在 A[i] < A[j]时,increase = true; 当数组中存在 A[i] > A[j]时,decrease = true; 如果A数组是单调数组,则 increase和decrease中只有一个为true,或都不 阅读全文
posted @ 2021-02-28 14:53 zjcfrancis 阅读(81) 评论(0) 推荐(0) 编辑
摘要:思路:动态规划 对于一个数字x1x2……xi,它的翻译方法 f( i ) 可以分为两种情况,xi-1和xi单独翻译和整体翻译。 当xi-1和xi单独翻译时,f( i ) = f ( i - 1 ) + f( i - 2 ) 当xi-1和xi整体翻译时,f( i ) = f( i - 1 ) 设动态规 阅读全文
posted @ 2021-02-28 05:02 zjcfrancis 阅读(53) 评论(0) 推荐(0) 编辑
摘要:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节 阅读全文
posted @ 2021-02-26 18:28 zjcfrancis 阅读(35) 评论(0) 推荐(0) 编辑
摘要:思路:贪心算法 取移动每一步的最优解,即可得到答案。 所有路径都会抵达棋盘的右下角,因此直接利用原棋盘数组记录每一格移动过去的礼物最大值,最终返回棋盘右下角元素即可。 代码: 时间复杂度O(MN),空间复杂度O(1) class Solution { public int maxValue(int[ 阅读全文
posted @ 2021-02-26 03:32 zjcfrancis 阅读(43) 评论(0) 推荐(0) 编辑
摘要:原理: 大丑数=小丑数x丑数因子(2,3,5) 所有丑数的集合,必然是由这三个数组合并去重得到的: A:{1*2,2*2,3*2,4*2,5*2,6*2,8*2,10*2......} B:{1*3,2*3,3*3,4*3,5*3,6*3,8*3,10*3......} C:{1*5,2*5,3*5 阅读全文
posted @ 2021-02-25 14:54 zjcfrancis 阅读(59) 评论(0) 推荐(0) 编辑
摘要:思路:(这也是动态规划的思想) 在最低价买入,最高价卖出。 使用 min 保存最低买入价格,res 保存最大利润,遍历数组找到结果。 代码: 时间复杂度O(n),空间复杂度O(1) class Solution { public int maxProfit(int[] prices) { if (p 阅读全文
posted @ 2021-02-25 14:22 zjcfrancis 阅读(36) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示