07 2020 档案
摘要:[编程题] lk 322. 零钱兑换 题目 输入输出 注意的问题 一开始我们默认把dp初始化为amount+1的值,当发现能更新的话就会更新掉这个值。 方法1:动态规划 class Solution { public int coinChange(int[] coins, int amount) {
阅读全文
摘要:[编程题] lk 300. 最长上升子序列-动态规划 题目 输入输出 注意的问题 这里说的是上升的可以是非连续的子序列的最长长度,可以采用动态规划来做。 思想: 转移方程: 我们在某点nums[i] 只要看其前边的0~i-1个比nums[i]小的数的最大dp[j]值。 那么,到dp[i] 的值就
阅读全文
摘要:[编程题] nk 二分查找的递归和非递归实现 题目 输入输出 见上 注意的问题 在二分查找的代码中,如果发现A[mid] == val,此时不能直接返回mid,而是还是需要往前遍历,看是否有相同的数字,有相同的数字的话,返回最前边的该数的索引。 方法1:非递归 //方法1:非递归 public in
阅读全文
摘要:[编程题] lk 120. 三角形最小路径和(动态规划) 在本文中会比较贪心算法和动态规划解题的场合 题目 输入输出 思路 贪心算法(本题不适用) 首先我们会想到贪心算法 贪心算法是什么呢?它其实是一种只会考虑当步最优,每一步,都保证在本次选择到的是最优的一个选择。但是它无法保证在本题中的全局最优,
阅读全文
摘要:[编程题] lk 338. 比特位计数-位运算 题目 输入输出 思想: 题意是给5,那么就分别算0,1,2,3,4,5这些数字化为二进制的时候其中的1的个数,我们对每个数计算二进制个数的话都用一次位运算计数处理 方法1:位运算 class Solution { //方法1:借助位运算 /*题目思
阅读全文
摘要:[编程题] lk 231. 2的幂 题目 输入输出 方法1:位运算 //方法3:使用位运算消除1 /*思想:如果是2的n次方,那么它的二进制肯定是0000000100000这种样子,其中是只有一个1(有可能是0000001),我们用位运算消除一次,看能否消除为0,就判断是否是2的幂次方*/ publ
阅读全文
摘要:[编程题] lk 152. 乘积最大子数组-二维动态规划 题目 输入输出 方法1:使用一个二维的dp来表示当前节点的最大值和最小值情况 思想: 每个dp[i]位置用两个维度表示值信息,dp[i][0]表示目前的最大值情况,dp[i][1]表示目前的最小值情况如负数 ① 我们在遍历数组的时候,
阅读全文
摘要:[编程题] nk 爬楼梯2-大数运算 题目 输入输出 Java代码 方法:动态规划 import java.util.*; import java.math.BigInteger; public class Main{ public static void main(String[] args){
阅读全文
摘要:[编程题] 基础 【动态规划】与练习-爬楼梯 知识点 1、基础 2、斐波那契数列例子 普通递归: 递归加记忆化 那么从树的下边往上推的话,顺推上去没救得到了状态转移方法。 案例1:爬楼梯 回溯的方法 回溯的思想是,我们如果是想到达第n台阶f(n)的话,那么就是从f(n-1)跳上来,也可以是从f(n-
阅读全文
摘要:[编程题] 基础 [位运算基础] 题目知识点 1、概念 2、基础运算符 3、异或性质 & 的使用
阅读全文
摘要:[编程题] lc 191. 位1的个数 题目 输入输出 Java代码 理解:这个题输入给的是2进制 //方法2:输入是二进制数的 public int hammingWeight(int n) { int count=0; while(n!=0){ n = n&(n-1); //这里的原理主要是n-
阅读全文
摘要:[编程题] 69. x 的平方根 题目 方法1:二分法 Java代码 public static int sqrt(int x) { if(x==0 || x==1){return x;} int l=0; int r=x; int res=-1; while (l<=r){ int m = (l+
阅读全文
摘要:[编程题] nk:数组中只出现一次的数字 输入输出 无 思路 方法1:借助两个set集合 方法2:借助栈 Java代码(方法1) /*方法1:set集合 拿两个set集合,在遍历的时候如果第一次出现的元素就直接放入set集合,当第二次出现都放在set2中,放完之后从set中排序set2中 含有元素,
阅读全文
摘要:[编程题] nk:连续子数组的最大和 输入输出 无 思路 方法:动态规划 Java代码 public class Solution { //方法1:动态规划 public int FindGreatestSumOfSubArray1(int[] array) { //[6,-3,-2,7,-15,1
阅读全文
摘要:[编程题] nk:约瑟夫问题(孩子们的游戏-圈内最终剩余的人的编号) 输入输出 说明: 思路 案例图解:我们以输入n=5,m=3为例: 解释: (一开始自己错的地方是在如下,while退出条件的地方,错写为dummy.next!=head为退出条件,其实我们本质是要检测圈中剩下一个节点,也就是dum
阅读全文
摘要:[编程题] nk:二叉搜索树的后序遍历 输入输出 无 思路 代码思路: 我们可以采用递归的思想,每次处理本次流程的时候(比如该组元素有n个),拿出最后一个节点当作是root节点,然后,在剩下的n-1 中,确定出前边的左子树部分都比root小,左子树后的右子树部分都比roo大; 比如:一开始调用传入的
阅读全文
摘要:[编程题] 知识点: 广度优先遍历-二叉树的层序遍历 题目 参考 练习:二叉树的层序打印(使用BFS) 题目 输入输出 Java代码 提示: 对于题目中方法是要求一开始返回一个int数组的,但是我们事先不知道树的节点的个数,如果我们遍历统计树的节点个数,显然是不划算的。 那么我们如何new 这个数组
阅读全文
摘要:牛客编程tips(数组、列表、字符串) 一、输入输出一般技巧 1、解决多行的输入输出 描述 Java代码 public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt()
阅读全文
摘要:[编程题] nk: 矩阵的最小路径和 题目 输入输出 Java代码(动态规划) import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(
阅读全文
摘要:[并发] Synchronized锁升级总结 线程进入时候检测标志位 如果是10则是重量级锁, 如果是00则是轻量级锁, 如果是01则是标志位:继续判断: (1)判断是否是**偏向锁** + 如果是的话,检测Mark Word对象头中是否是当前线程;是的话,执行业务逻辑,该线程的每次进入同步
阅读全文
摘要:[编程题] lc 169. 多数元素 题目 输入输出 Java代码(方法1:借用哈希表计数) //方法1:借助哈希 public int majorityElement(int[] nums) { HashMap<Integer,Integer> map = new HashMap<>(); for
阅读全文
摘要:[编程题] 递归实现等差数列和阶乘 需求 使用递归实现等差数列 Java代码 package nlikou; /** * @author jiyongjia * @create 2020/7/26 - 18:40 * @descp: */ public class P11_jiecheng { pu
阅读全文
摘要:[编程题] lc:三数之和 (借助哈希表) 需求 输出输出 思考 如果用三个for遍历的话,会出现时间复杂度是O(n的3次方) 考虑使用两层for确定2个数,第三个数在哈希表中确定是否有。 在确定第三个数的时候,需要判断这个数的下标是否是i指向的值,或者是j指向的值。如果是的话,这个数不少我们想要的
阅读全文
摘要:[编程题] 基础:如何使用大顶堆和小顶堆找topN 需求 (1)我们如何从一个链表或者数组中,找到第k大的数,或者前k大的数。使用小顶堆。(输出是从小到大排列的前K大的数) (2)我们如何从一个链表或者数组中,找到第k小的数,或者前k小的数(输出的堆是堆顶最大,其他不是序列顺序),使用大顶堆。 小顶
阅读全文
摘要:[编程题] lc:剑指 Offer 54. 二叉搜索树的第k大节点 [编程题] JZ:剑指 Offer 62. 二叉搜索树的第k小节点 <1>题目1 描述: 输入输出 思路 根据二叉搜索树的特点: 根据二叉搜索树的特点,中序遍历是从小到大排序,求第k小恰好是第k个节点,我们按照左 根 右 搜索。(搜
阅读全文
摘要:[编程题] JZ65 矩阵中的路径 题目描述 输入输出案例 参考 参考 思路 使用回溯、递归、枚举的思想 代码 class Solution { public boolean exist(char[][] board, String word) { //用于标记是否已经被访问的二维数组 boolea
阅读全文
摘要:[编程题] JZ57 二叉树的下一个节点 题目描述 参考 参考讲解 思路 主要根据中序遍历二叉树的特点: 如果此节点有右子树,就循环找出该右子树的最深处的左子树。 如果此节点无右子树,则返回的就应该是其父亲节点(这里存在一直往上返回其父节点。) 代码 /* public class TreeLink
阅读全文
摘要:[编程题] JZ4 重建二叉树 参考 参考讲解 思路 我们根据前序遍历的首节点就指定二叉树的根,我们在中序遍历中查找这个根,就可以把中序遍历分为两部分,即左子树和右子树。那么,我们知道了左子树的长度,我们也可以在前序遍历中知道前序遍历中左子树的数组范围。此时: 我们知道了前序遍历中的左子树的子数组,
阅读全文
摘要:[编程题] lc:703. 数据流中的第K大元素 题目描述 输入输出 思路 使用一个小顶堆,我们始终让小顶堆自平衡的调整保存需要的前k大小的元素,(堆顶元素最小,也就是这组数组的第k)。在我们添加一个元素进来的时候,只需要和堆顶元素比较,如果要添加的val比堆顶元素都小的话,就丢弃,如果比堆顶元素大
阅读全文
摘要:[编程题] lc:128. 最长连续序列 题目描述 输入输出 见上 思路 逐个的拿出数组中的元素,把它假想为是最小的数。然后累加1且去哈希表中找是否有,如果有count就加1、然后知道set中没有的时候得出本次count的值。又一次拿出数组中的第2个元素执行如上操作。最终返回一个最长的count值。
阅读全文
摘要:[编程题] lc:674. 最长连续递增序列 题目描述 给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。 输入输出 思路 Java代码 class Solution { public int findLengthOfLCIS(int[] nums) { //极端条件 if
阅读全文
摘要:[编程题] lc:面试题 03.05. 栈排序 题目描述 输入输出 思路 主要思路: 利用一个辅助栈来帮助在插入一个元素的时候进行排序,使得我们的主栈内元素始终是有序的(栈底到栈顶大到小),当push一个元素到主栈的时候,实在先看主栈栈顶元素。 如果栈顶元素小于当前val,利用辅助栈将主栈栈顶元
阅读全文
摘要:[编程题] lc:最小路径和 题目描述 输入输出 思路 原地动态 规划 Java代码 class Solution { //方法:原地dp的动态规划 public int minPathSum(int[][] grid) { for(int i=0;i<grid.length;i++){ for(i
阅读全文
摘要:[编程题] lc: 面试题 10.09. 排序矩阵查找 时间:2020.07.23 题目描述 给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。 输入输出案例 思路 从矩阵的右上角的元素开始找,右上角的元素与target比较: 如果右上角的元素和target相等,返回true 如果右
阅读全文
摘要:单链表快排与数组快排 时间:2020.07.23 一、传统快排思想 思想简介: 传统的快速排序算法使用到递归 快排是对冒泡排序算法的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按照此方法对两部分数据使用**递归**进行如上
阅读全文
摘要:[编程题] nk:链表中的入环节点 题目描述 输入输出例子 无 思路 方法1、借助哈希表 思想:我们通过一个dummyNode不断遍历每一个节点,当我们每次遍历到这个当前节点的时候就看他在不在哈希表中,不在的话加入进去;在的时候就恰好这个节点就是入环节点。 时间复杂度:O(n) Java代码 imp
阅读全文
摘要:[编程题] lc:167. 两数之和 II - 输入有序数组 题目描述 .assets/image-20200721115631557.png) 输入输出例子 见上 思路 方法1、暴
阅读全文
摘要:[编程题] lc:剑指 Offer 14- I. 剪绳子 题目描述 输入输出例子 思路 方法1、从数据公式上探索 Java代码 class Solution { public int cuttingRope(int n) { //情况1:对于两种极端情况先讨论 if(n==1 || n==2){re
阅读全文
摘要:lc 剑指 Offer 09. 用两个栈实现队列 题目描述 输入输出描述 思路 1、使用传统的栈Stack即可完成 2、使用Deque数据结构堵住一端(堵住首) (addLast(),removeLast) 或者堵住尾(addFirst();removeFirst) 3、使用Deque数据结构堵住一
阅读全文
摘要:[编程题] lc:20. 有效的括号-考察栈 题目描述 输入输出例子 思路 思路 使用栈结构,用map保存匹配键值对(LinkedList实现Deque接口模拟栈) Java代码 class Solution { public boolean isValid(String s) { //借助栈 De
阅读全文
摘要:[编程题] lc:24. 两两交换链表中的节点 题目描述 输入输出例子 思路 参考:https://www.bilibili.com/video/BV1VC4y1s75E?from=search&seid=7587439253853836582 先构造一个dummy节点,指向和连接这个链表。再使用这
阅读全文
摘要:[编程题] lc:344. 反转字符串 题目描述 输入输出例子 方法1:前后指针 Java代码 //方法1:前后指针的交换元素 public void reverseString1(char[] s) { int l = 0; int r = s.length-1; while(l<=r){ cha
阅读全文
摘要:[编程题] lc:344. 反转字符串 题目描述 输入输出例子 方法1:前后指针 Java代码 //方法1:前后指针的交换元素 public void reverseString1(char[] s) { int l = 0; int r = s.length-1; while(l<=r){ cha
阅读全文
摘要:[编程题] lc:70. 爬楼梯 题目描述 输入输出例子 方法1:普通递归 思想:化为子问题 Java代码 //方法1:普通递归 public int climbStairs(int n) { if(n==1){return 1;} if(n==2){ return 2; }else{ return
阅读全文
摘要:[编程题] lc:236. 二叉树的最近公共祖先 题目描述 输入输出例子 思路 使用后续遍历的思想,根据找到了左和右的情况,进行相应的返回结果。 Java代码 /** * Definition for a binary tree node. * public class TreeNode { * i
阅读全文
摘要:[编程题] 牛客输入输出练习1-计算a+b(多组输入)] 1、牛客输入输出练习1-计算a+b(多组输入) 题目描述 计算多组输入的a+b 示例 输入输出描述: 输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。 输出描述: 输出a+b的结果 例如2: 输入
阅读全文
摘要:单链表判断是否回文 题目描述 思路 三个指针,分别n1,n2,n3;三个指针不断往后移动。 1、总体思路 找到中间节点,然后把后半个链表反转后与前半部分比较。 (注意:奇数个链表的话是从中点的后一个节点逆置;偶数个链表的话从中间链表的节点逆置) 2、问题是如何找到中间节点 使用快慢指针,两指针一开始
阅读全文
摘要:翻转单链表 题目描述 思路 三个指针,分别n1,n2,n3;三个指针不断往后移动。 Java代码 方法1:三个指针标记循环往后走 //方法3:三个指针循环后移 public ListNode reverseList(ListNode head) { if(head==null) {return nu
阅读全文
摘要:题目:判断链表是否有环 题目描述 示例 进阶: 你能用 O(1)(即,常量)内存解决此问题吗? Java代码 方法1:快慢指针 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next
阅读全文
摘要:牛客输入输出练习1-计算a+b(多组输入) 题目描述 计算多组输入的a+b 示例 输入输出描述: 输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。 输出描述: 输出a+b的结果 例如2: 输入: 1 5 10 20 输出: 6 30 Java代码 imp
阅读全文
摘要:找出前边比自己高的人的身高--字节笔试题 题目描述 存在一个多组的输入,第一行输入是有N个同学,接下来的一行分别是N个同学的身高。某同学X前的第一个比他高的同学,记录下其身高值。返回是一行每个同学对应找到的其前边的第一个比自己高的身高值。 示例 例如1: 输入: 5 1 2 3 4 5 输出: -1
阅读全文
摘要:反转字符串 题目描述 示例 Java代码 class Solution { //思想:前后位置交换 public void reverseString(char[] s) { //标记数组首 int left = 0; //标记数组尾 int right = s.length-1; //临时变量,初
阅读全文
摘要:合并两个有序链表 题目描述 示例 Java代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int
阅读全文
摘要:字符串成环判断是否为回文字符串 题目描述 输入一个字符串,将该字符串首尾成环,判断能否从中某位置切分,然后产生回文字符串,是则输出Yes,否则输出No 示例 例如1: 输入(字符串) aab 成环后从a a 中切分,得到回文字符串: aba 输出:Yes Java代码 package ncompan
阅读全文
摘要:打印出失序的线程ID 题目描述 输入一个正整数n.表示接下来有n行数字,每行一个数字(不重复,可能无序),表示线程id,输出未出现的失序的线程ID n的大小是小于等于2的32次方 示例 例如1: 输入(输入的线程ID不一定有序) 5 2 3 4 5 6 输出: 1 例如2: 输入: 4 1 2 3
阅读全文
摘要:从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 思路 把栈从头到尾的遍历,在遍历的时候放入栈中,栈使用(LinkedList结构模拟),然后在存完后把栈中的一个个元素pop出放入list中。 Java代码 import java.util.*; /** *
阅读全文
摘要:数组中的重复数字 题目描述 Java代码 、import java.util.*; public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbe
阅读全文