
算法
Meiko丶
这个作者很懒,什么都没留下…
展开
-
LeetCode 27:移除元素
题意给你一个数组 nums 和一个 val,原地移除所有数值等于 val 的值,并返回移除后数组的新长度。示例输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3]解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。提示必须使用 O(1) 空间复杂度并原地修改输入数组。0 <= len(nu..原创 2022-01-26 10:33:24 · 814 阅读 · 0 评论 -
31.栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入:[1,2,3,4,5],[4,5,3,2,1]返回值:true说明:可以通过push(1) => push(2) => push(3) => pu..原创 2022-01-14 11:02:35 · 164 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。此栈包含的方法有:push(value):将value压入栈中 pop():弹出栈顶元素 top():获取栈顶元素 min():获取栈中最小元素思路 & 解答主要是两个栈,一个存储所有元素的datas stack,一个存储最小值 mins stack。push一个元素的时候,都需要push进datas stack,但是push进入mins stack需要满足条件:原创 2022-01-12 19:31:21 · 143 阅读 · 0 评论 -
让3个线程打印ABC
让3个线程依次打印ABC,是一个常见的(面试)问题,这是阿里和华为都有考过的面试题。比如题目描述如下:编写一个程序,开启三个线程,这三个线程按照顺序依次打印ABC,每个字母打印10次后结束,最后结果如 ABCABCABC... 依次递推这是一道经典的多线程编程面试题,首先吐槽一下,这道题的需求很是奇葩,先开启多线程,然后再串行打印 ABC,这不是吃饱了撑的吗?不过既然是道面试题,就不管这些了,其目的在于考察你的多线程编程基础。这个题目肯定是要启动3个线程的,那怎么让这3个线程“协作”按顺序打原创 2021-12-03 11:56:01 · 1932 阅读 · 0 评论 -
动态规划详解
什么是动态规划?动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler su...转载 2021-10-27 19:55:30 · 63317 阅读 · 29 评论 -
NC108 最大正方形
描述给定一个由'0'和'1'组成的2维矩阵,返回该矩阵中最大的由'1'组成的正方形的面积示例1输入:[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]复制返回值:4使用动态规划降低时间复杂度。我们用dp(i,j) 表示以 (i, j) 为右下角,且只包含 1 的正方形的边长最大值。如果能计算出所有 dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 1 的正方形的边长最大值,其平方即为最大正方形的面积。对于每个位置 (原创 2021-09-18 10:28:14 · 190 阅读 · 0 评论 -
NC57 反转数字
描述给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。你有注意到翻转后的整数可能溢出吗?因为给出的是32位整数,则其数值范围为[−2^{31}, 2^{31} − 1][−231,231−1]。翻转可能会导致溢出,如果反转后的结果会溢出就返回 0。示例1输入:12复制返回值:21复制示例2输入:-123复制返回值:-321复制示例3输入:10复制返回值:1复制示例4输入:1原创 2021-09-18 10:28:28 · 126 阅读 · 0 评论 -
NC136 输出二叉树的右视图
描述请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图示例1输入:[1,2,4,5,3],[4,2,5,1,3]复制返回值:[1,3,5]复制备注:二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。对于任意一颗树而言,前序遍历的形式总是[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]即根节点总是前序遍历中的第一个节点。而中序遍历的形式总是[ [左子树的中序遍历结果], 根节点, [右子树原创 2021-09-18 10:28:44 · 146 阅读 · 0 评论 -
NC25 删除有序链表中重复的元素-I
描述删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次例如:给出的链表为1\to1\to21→1→2,返回1 \to 21→2.给出的链表为1\to1\to 2 \to 3 \to 31→1→2→3→3,返回1\to 2 \to 31→2→3.示例1输入:{1,1,2}复制返回值:{1,2}public ListNode deleteDuplicates (ListNode head) { if(head==nul原创 2021-09-18 10:28:55 · 112 阅读 · 0 评论 -
NC120 二进制中1的个数
描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入:10复制返回值:2如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现原创 2021-09-18 10:29:05 · 128 阅读 · 0 评论 -
NC147 主持人调度
描述有 n个活动即将举办,每个活动都有开始时间与活动的结束时间,第个活动的开始时间是start_istarti,第个活动的结束时间是end_iendi,举办某个活动就需要为该活动准备一个活动主持人。一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第个活动,那么该主持人在(start_i,end_i)(starti,endi)这个时间段不能参与其他任何活动。求为了成功举办这个活动,最少需要多少名主持人。示例...原创 2021-09-18 10:29:18 · 379 阅读 · 0 评论 -
NC134 股票(无限次交易)
描述假定你知道 n天内的某只股票每一天价格的变动。你最多可以同时持有一只股票。但你可以无限次的交易(买进和卖出均无手续费)。请设计一个函数,计算你所能获得的最大收益。输入一个数组,数组长度为 n,数组中每一个元素为arr_iarri代表当天股票的价格,示例1输入:[5,4,3,2,1]复制返回值:0复制说明:由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。 示例2输入:[1,2,3,4,5]复制返回值:...原创 2021-09-17 18:36:08 · 307 阅读 · 0 评论 -
NC144 不相邻最大子序列和
描述给你一个数组,其长度为 n,在不同时选择位置相邻的两个数的基础上,求挑选出来的最大子序列的和(子序列可以为空)数据范围:1 \le n \le 10^51≤n≤105示例1输入:3,[1,2,3]复制返回值:4复制说明:有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4 示例2输入:4,[4,2,3,5]复制返回值:9复制说明:其中[4,5]的选取方案是在满足不同时选取相邻位.原创 2021-09-17 18:15:15 · 236 阅读 · 0 评论 -
NC117 合并二叉树
描述已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:两颗二叉树是:Tree 1 1 / \ 3 2 / 5 Tree 2 2 / \1 3 \ \ 4 7合并后的树为 3 / \ 4 5/ \ \5 4 7示例1输入:{1,3,2,5},{2,1,3,...原创 2021-09-17 11:47:41 · 154 阅读 · 0 评论 -
NC26 括号生成
描述给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如,给出n=3,解集为:"((()))", "(()())", "(())()","()()()","()(())",示例1输入:1复制返回值:["()"]复制示例2输入:2复制返回值:["(())","()()"]import java.util.ArrayList;public class Solution { /** * 题目:括号..原创 2021-09-17 11:22:04 · 258 阅读 · 0 评论 -
NC90 包含min函数的栈
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,并且调用 min函数、push函数 及 pop函数 的时间复杂度都是 O(1)push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素示例:输入:["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]输出:-1,2,1,-1解析:"PSH-1"表示将-1压...原创 2021-09-17 11:16:13 · 102 阅读 · 0 评论 -
NC112 进制转换
描述给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。若 M 为负数,应在结果中保留负号。示例1输入:7,2复制返回值:"111"复制备注:M是32位整数,2<=N<=16.除N取余,然后倒序排列,高位补零。public String solve (.原创 2021-09-17 11:07:02 · 89 阅读 · 0 评论 -
NC54 数组中相加和为0的三元组
描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10) 0 <= S.length <= 1000示例1输入:[0]复制返回值:[]复制示例2输入:[-2原创 2021-09-17 10:33:05 · 288 阅读 · 0 评论 -
NC106 三个数的最大乘积
描述给定一个长度为的无序数组,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。要求时间复杂度:,空间复杂度:。数据范围:3 \le n \le 2 * 10^53≤n≤2∗105-10^6 \le A[i] \le 10^6−106≤A[i]≤106示例1输入:[3,4,1,2]复制返回值:24复制1、如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同...原创 2021-09-17 10:33:20 · 172 阅读 · 0 评论 -
NC71 旋转数组的最小数字
描述有一个长度为N的升序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求它的最小值。提示:1 <= N<= 100000 <= rotateArray[i] <= 10000你可以使用O(logN)的时间复杂度通过该题吗?示例1输入:[3,4,5,1,2]复制返回值:1原创 2021-09-17 10:34:46 · 114 阅读 · 0 评论 -
NC9 二叉树中是否存在节点和为指定值的路径
描述给定一个二叉树和一个值\ sumsum,判断是否有从根节点到叶子节点的节点值之和等于\ sumsum的路径,例如:给出如下的二叉树,\ sum=22sum=22,返回true,因为存在一条路径5\to 4\to 11\to 25→4→11→2的节点值之和为 22示例1输入:{1,2},0复制返回值:false复制示例2输入:{1,2},3复制返回值:true递归实现import java.util.*;/...原创 2021-09-17 10:34:56 · 175 阅读 · 0 评论 -
NC2 重排链表
描述将给定的单链表\ LL:L_0→L_1→…→L_{n-1}→L_ nL0→L1→…→Ln−1→Ln重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0→Ln→L1→Ln−1→L2→Ln−2→…要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。示例1输入:{1,2,3,4}复制返回值:{1,4,2,3}复制说明:给定head链表1->2->3->4, 重新排列为 1...原创 2021-09-16 19:15:38 · 218 阅读 · 0 评论 -
NC81 二叉搜索树的第k个结点
描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入:{5,3,7,2,4,6,8},3复制返回值:4复制说明:按结点数值大小顺序第三小结点的值为4 非递归实现:二叉搜索树的第k个结点 中序遍历import java.util.Stack;public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot ==原创 2021-09-16 15:34:31 · 144 阅读 · 0 评论 -
NC38 螺旋矩阵
描述给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。示例1输入:[[1,2,3],[4,5,6],[7,8,9]]复制返回值:[1,2,3,6,9,8,7,4,5]解题思路:按照从左到右、从上到下、从右到左、从下到上的顺序依此遍历。import java.util.*;public class Solution { public ArrayList<Integer> spiralOrder(int[][] matr原创 2021-09-16 15:18:36 · 103 阅读 · 0 评论 -
单调栈
描述给定一个长度为nn的可能含有重复值的数组arrarr,找到每一个ii位置左边和右边离ii位置最近且值比arr_iarri小的位置。请设计算法,返回一个二维数组,表示所有位置相应的信息。位置信息包括:两个数字LL和RR,如果不存在,则值为 -1,下标从 0 开始。数据范围:1 \le n \le 10^51≤n≤105-10^9 \le arr[i] \le 10^9−109≤arr[i]≤109示例1输入:[3,4,1,5,6,2...原创 2021-09-16 15:16:44 · 108 阅读 · 0 评论 -
NC23 划分链表
双指针我们经常听过,但四指针还是比较少的,四指针顾名思义就是使用4个指针来解决。这题是让把节点值小于x的节点都放到前面,最简单的一种解决方式就是把原链表的节点分隔为两个链表,其中一个链表节点的值都是小于x的,另一个链表节点的值都是大于或等于x的,最后再把这两个链表合并即可。这里要使用四个指针,其中两个指向小的链表,两个指向大的链表,原理如下图所示public ListNode partition(ListNode head, int x) { //小链表的头 ListNod..原创 2021-09-16 14:44:42 · 199 阅读 · 0 评论 -
NC69 链表中倒数最后k个结点
描述输入一个长度为的链表,设链表中的元素的值为a_iai,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。提示:0 \leq n \leq 10^50≤n≤1050 \leq a_i \leq 10^90≤ai≤1090 \leq k \leq 10^90≤k≤109示例1输入:{1,2,3,4,5},3复制返回值:{3,4,5}复制示例2输入:{2},.原创 2021-09-16 14:21:38 · 512 阅读 · 0 评论 -
NC129 阶乘末尾0的数量
描述给定一个非负整数NN,返回N!N!结果的末尾为00的数量。N!N!是指自然数NN的阶乘,即:N!=1*2*3…(N-2)*(N-1)*NN!=1∗2∗3…(N−2)∗(N−1)∗N。特殊的,的阶乘是。复杂度要求:不大于O(\log n)O(logn)示例1输入:3复制返回值:0复制说明:3!=6 示例2输入:5复制返回值:1复制说明:5!=120 示例3输入:...原创 2021-09-16 15:35:33 · 233 阅读 · 0 评论 -
NC125 未排序数组中累加和为给定值的最长子数组长度
描述给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有连续子数组中累加和为k的最长子数组长度。保证至少存在一个合法的子数组。示例1输入:[1,-2,1,1,1],0复制返回值:3假设s(i)是子数组arr[0…i]的累加和,那么s(j)就代表arr[0…j]的累加和,那么可求得arr[j+1…i]=s(i)-s(j)。流程:1.初始化变量sum=0,表示从arr[0]一直加到arr[i]的累加和。初始化变量len,表示累加到和为k的最长子原创 2021-09-16 15:35:46 · 401 阅读 · 0 评论 -
NC30 数组中未出现的最小正整数
描述给定一个无序数组arr,找到数组中未出现的最小正整数例如arr = [-1, 2, 3, 4]。返回1arr = [1, 2, 3, 4]。返回5[要求]时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)示例1输入:[-1,2,3,4]复制返回值:1先将数组排序,当排序后的数组的最后一个元素为负或为0即缺失的为1,定义一个目标min先定义为1,遍历数组,在遍历过程中将数组值与目标值比较是否相等,即min从最小正整数1开始增长 1原创 2021-09-16 15:35:55 · 300 阅读 · 0 评论 -
NC107 寻找峰值
描述山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。假设nums[-1] = nums[n] = -∞。提示:1 <= 数组长度<= 10000 <= 数组元素的值 <= 1000示例1输入:[2,4,1,2,7,8,4]复制返回值:5复制 因为要求索引值最大的峰值,所以从末尾遍历数组,找到的第一...原创 2021-09-16 15:36:05 · 166 阅读 · 0 评论 -
NC27 集合的所有子集
描述现在有一个没有重复元素的整数集合S,求S的所有子集注意:你给出的子集中的元素必须按升序排列给出的解集中不能出现重复的元素示例1输入:[1,2,3]复制返回值:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]选择第i个元素:此时组合结果为=原来的组合 U 原来每一个组合加上元素i 的组合, U表示并集 。import java.util.*;public class Solution { ArrayList&l原创 2021-09-15 18:50:52 · 164 阅读 · 0 评论 -
NC142 最长重复子串
描述定义重复字符串是由两个相同的字符串首尾拼接而成,例如 abcabc便是长度为6的一个重复字符串,而则不存在重复字符串。给定一个字符串,请返回其最长重复子串的长度。若不存在任何重复字符子串,则返回 0 。数据范围:字符串长度不大于2 \times 10^42×104示例1输入:"ababc"复制返回值:4复制说明:abab为最长的重复字符子串,长度为4 示例2输入:"abcab"复制返回值:0复制...原创 2021-09-15 18:12:23 · 760 阅读 · 0 评论 -
NC101 缺失数字
描述从 0,1,2,...,n 这 n+1 个数中选择 n 个数,选择出的数字依然保持有序,找出这 n 个数中缺失的那个数,要求O(n) 或 O(log(n)) 并尽可能小。示例1输入:[0,1,2,3,4,5,7]复制返回值:6复制示例2输入:[0,2,3]复制返回值:11,位运算求解题中的意思就是从数字[0,n]之间的n+1个数字少了一个,而其他的数字都存在。如果我们把这个数组添加从0~n的n+1个元素,就变成了数组中只有一个数出.原创 2021-09-15 17:42:51 · 116 阅读 · 0 评论 -
NC73 数组中出现次数超过一半的数字
描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000示例1输入:[1,2,3,2,2,2,5,4,2]复制返回值:2复制示例2输入:[3,3,3,3,2,2,2]复制返回值:3原创 2021-09-15 16:48:11 · 198 阅读 · 0 评论 -
NC113 验证IP地址
描述编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一.原创 2021-09-15 16:35:35 · 214 阅读 · 0 评论 -
NC63 扑克牌顺子
描述现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:1. A为1,J为11,Q为12,K为13,A不能视为142. 大、小王为 0,0可以看作任意牌3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。例如:给出数据[6,0,2,0,4]中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]这样这五张牌在[2,6]区间连续,输出true数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0,..原创 2021-09-15 16:16:36 · 269 阅读 · 0 评论 -
NC29 二维数组中的查找
描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target= 7,返回true。给定target=3,返回false。0 <=array.length<= 5000 <=ar...原创 2021-09-15 15:35:37 · 200 阅读 · 0 评论 -
NC132 环形链表的约瑟夫问题
描述编号为11到nn的nn个人围成一圈。从编号为11的人开始报数,报到mm的人离开。下一个人继续从11开始报数。n-1n−1轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?示例1输入:5,2 复制返回值:3 复制说明:开始5个人 1,2,3,4,5 ,从1开始报数,1->1,2->2编号为2的人离开1,3,4,5,从3开始报数,3->1,4->2编号为4的人离开1,3,5,从5开始报数,...原创 2021-09-15 14:36:51 · 132 阅读 · 0 评论 -
NC60 判断一棵二叉树是否为搜索二叉树和完全二叉树
验证二叉搜索树递归实现public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);} private boolean isValidBST(TreeNode root, long lower, long upper) { if (root == null) { return true; } if (root.va原创 2021-09-15 14:37:17 · 86 阅读 · 0 评论