
算法
空城不空99
耐得住寂寞,守得住繁华!
展开
-
华为考试题2
华为考试题2package com.cyl.enquiry.controller;import java.nio.charset.StandardCharsets;import java.util.Scanner;/** * @author cuiyongling * @since V1.0.0 * 2021-06-02 14:17 */public class Test5 { public static void main(String[] args) {原创 2021-06-12 16:47:56 · 463 阅读 · 0 评论 -
LeetCode1262:可被三整除的最大和(动态规划)
1262. 可被三整除的最大和给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。 /** * 可被三整除的最大和:动态规划 * dp[i][0]表示nums[0...i]模三余零的最大和 * dp[i][1]表示nums[0...i]模三余一的最大和 * dp[i][2]表示nums[0...i]模三余二的最大和 * 零状态:当前数字最大和模三余零 * 一状态:当前数字最大和模三余一 * 二状态:当前数字最大和模三原创 2020-10-13 21:05:53 · 692 阅读 · 0 评论 -
牛客网:数字序列第n位的值(等差序列)
牛客网:数字序列第n位的值(等差序列)等差数列类问题:1 22 333 4444 …是等差数列: 1 2 3 4 … n(即n代表的就是当前数字出现的次数),由等差数列求和公式,只需要有S = (1 + i)*i/2 >= n 即可求出i,i就是当前的答案。import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(Syst原创 2020-08-19 20:47:24 · 502 阅读 · 0 评论 -
牛客网:回文子串(暴力求解-动态规划)
牛客网:回文子串(暴力求解-动态规划)方法一:暴力求解:枚举出所有的子串,判断每一个子串是否是回文串。时间复杂度:O(N^3)空间复杂度:O(1)import java.util.*;public class Main{ /** *判断一个字符串是否是回文子串 */ public static boolean isVaild(String s,int start,int end){ while(start<end){原创 2020-08-19 20:18:12 · 319 阅读 · 0 评论 -
牛客网:井字棋(数组-枚举)
牛客网:井字棋(数组-枚举)import java.util.*;public class Board { public boolean checkWon(int[][] board) { // write code here //赢的情况:某一列某一行或对角线是否都连接起来:进行枚举 if(board[0][0] ==1 && board[1][1] == 1 && board[2][2] ==1) return原创 2020-08-18 17:37:02 · 253 阅读 · 0 评论 -
牛客网:上楼梯(动态规划)
牛客网:上楼梯(动态规划)import java.util.*;public class GoUpstairs { /** 动态规划:定义状态、初始化状态、确定状态转移方程、进行输出 */ public int countWays(int n) { // write code here if(n <1){ return 0; } //定义状态dp[i]:上i原创 2020-08-18 17:12:28 · 269 阅读 · 0 评论 -
牛客网:下一个较大元素(暴力求解)
牛客网:下一个较大元素(暴力求解)注:一定要看清题意。两层for循环搜索:import java.util.*;public class NextElement { public int[] findNext(int[] A, int n) { // write code here int[] ret=new int[n]; for(int i=0;i<n;i++){ ret[i]=-1;原创 2020-08-18 17:00:27 · 89 阅读 · 0 评论 -
牛客网:最近公共祖先(满二叉树)
牛客网:最近公共祖先(满二叉树)import java.util.*;public class LCA { /** 最近公共祖先 动态规划:定义状态,初始化状态,定义状态转移方程,进行输出 */ public int getLCA(int a, int b) { // write code here /** * 树中子节点与父节点之间的关系为root = child / 2 所以如果a != b,就让原创 2020-08-18 16:15:52 · 248 阅读 · 0 评论 -
奇安信算法面试20200816编程题1:老板发奖金(动态规划)
奇安信算法面试20200816编程题1:老板发奖金(动态规划)老板一共需要给某个员工发n元红包,可以选择一次发1、2、3、、、n元,请:老板发完n元总共有多少种方法。 /** * 老板发奖金 * 动态规划:确定状态、状态转移方程、初始化状态、进行输出 * @param num_money * @return */ public int f1(int num_money){ if(num_money <=0){原创 2020-08-16 18:36:29 · 1582 阅读 · 1 评论 -
奇安信算法面试20200816编程题2:Undo和Redo(字符串)
奇安信算法面试编程题:Undo和Redo(字符串)给定字符串(以空格或者tab键分隔),碰到undo将前面的一个字符串删除,碰到redo将之前删除的字符串恢复。 public String f2(String str){ str.trim(); if(str.length()==0){ return ""; } //匹配多个空格 String[] arr = str.split("\\s+");原创 2020-08-16 18:06:05 · 470 阅读 · 0 评论 -
LeetCode15:三数之和(数组-双指针)
LeetCode15:三数之和(数组-双指针)1、给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。方法一:暴力:时间复杂度:O(N^3)三个for循环方法二:双指针:时间复杂度:O(N^2) /** * 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0原创 2020-08-14 20:19:04 · 170 阅读 · 0 评论 -
LeetCode698:划分为k个相等的子集(递归)
LeetCode698:划分为k个相等的子集(递归)1、给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。方法一:递归:思路:对于每个数来讲,其都有k个选择(就是k个桶),每个数都需要尝试放在第i(i>=0&&i<K)个桶里。只要当前尝试的第i个桶正好能放下当前的数或者放下当前的数后桶里的容量还有剩余,那么这个数就可以放在这个桶里,那么我们就可以进行对下一个数选择可以放入的桶了。在进行递归函数之前,就进行了预处原创 2020-08-14 18:46:38 · 458 阅读 · 0 评论 -
LeetCode1343:大小为 K 且平均值大于等于阈值的子数组数目(滑动窗口)
LeetCode1343:大小为 K 且平均值大于等于阈值的子数组数目(滑动窗口)1、给你一个整数数组 arr 和两个整数 k 和 threshold 。请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。方法一:滑动窗口思路:如果用除法会有点麻烦,用乘法将要比较的值的乘积算出来,这样可以更方便比较;先将前k个值的和算出来,之后遍历剩下的元素,用前k个计算出来的和减一个arr[i-k],加一个arr[i],就相当于直接求出滑动窗口为k的元素的和,节约了时间。复杂度分析时原创 2020-08-13 21:55:21 · 447 阅读 · 0 评论 -
LeetCode26:删除排序数组中的重复项(双指针)
LeetCode26:删除排序数组中的重复项(双指针)1、给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。方法一:笨拙:思路:定义两个指针,前后进行比较,遇到前后不相同的就将后面的元素全部往前移一位,当存在大量重复元素时,需要重复移动好多次。复杂度分析时间复杂度:O(N^2)空间复杂度:O(1) public int removeDupl原创 2020-08-13 21:01:40 · 145 阅读 · 0 评论 -
LeetCode 剑指 Offer 09:用两个栈实现队列(栈-队列)
LeetCode 剑指 Offer 09:用两个栈实现队列(栈-队列)1、用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )思路:1、维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。2、根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维原创 2020-08-13 20:28:11 · 196 阅读 · 0 评论 -
LeetCode559:N叉树的最大深度(深度优先搜索DFS+广度优先遍历BFS)
LeetCode559:N叉树的最大深度(深度优先搜索DFS+广度优先遍历BFS)1、给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。方法一:深度优先遍历DFS:复杂度分析时间复杂度:每个节点遍历一次,所以时间复杂度是 O(N),其中 N 为节点数。空间复杂度:最坏情况下, 树完全非平衡,例如 每个节点有且仅有一个孩子节点(链表),递归调用会发生 N 次(等于树的深度),所以存储调用栈需要 O(N)。但是在最好情况下(树完全平衡),树的高度为 log原创 2020-08-12 22:00:15 · 865 阅读 · 0 评论 -
LeetCode215:数组中的第K个最大元素(数组-排序算法-分治算法-堆排序)
LeetCode215:数组中的第K个最大元素(数组-排序算法-分治算法-堆排序)1、在未排序的数组中找到第 k 个最大的元素。你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。方法一:调用库函数:直接调用库函数 public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return nums[nums.length-k]; }方法二:快原创 2020-08-12 18:39:10 · 677 阅读 · 0 评论 -
LeetCode509:斐波那契数列(递归-动态规划)
LeetCode509:斐波那契数列(递归-动态规划)方法一:递归: /** * 斐波安切数列 * 递归:自己调用自己,直到终止条件 * @param n * @return */ public int fib2(int n) { //递归终止的条件 if(n == 0|| n==1){ return n; } //递归的内容 retur原创 2020-08-12 16:26:28 · 269 阅读 · 0 评论 -
LeetCode8:字符串转换整数(字符串)
LeetCode8:字符串转换整数(字符串)题目很简单,就是比较麻烦。思路:1、去掉前导空格2、再是处理正负号3、识别数字,注意越界情况。这道题目如果只是简单地字符串转整数的话,就是简单地 ans = ans * 10 + digit。但是注意这道题目可能会超过integer的最大表示!也就是说会在某一步 ans * 10 + digit > Integer.MAX_VALUE...原创 2020-08-12 14:45:05 · 150 阅读 · 0 评论 -
LeetCode944:删除造序(贪心算法)
LeetCode944:删除造序(贪心算法)一定要看明白题目:方法一:贪心法:对于每一列,我们检查它是否是有序的。如果它有序,则将删除的列增加 1,否则它必须被删除。复杂度分析:时间复杂度:O(N),其中 N 是数组 A 中的元素个数。空间复杂度:O(1)。 /** * 删除造序 * 贪心法:对于每一列,我们检查它是否是有序的。如果它有序,则将删除列增加 1,否则它必须被删除。 * @param A * @return */原创 2020-08-11 22:13:41 · 168 阅读 · 0 评论 -
LeetCode1518:换酒问题(贪心算法)
LeetCode1518:换酒问题(贪心算法)1、小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。请你计算最多能喝到多少瓶酒。方法一:模拟:思路:首先我们一定可以喝到 b瓶酒,剩下 b个空瓶。接下来我们可以拿瓶子换酒,每次拿出 e个瓶子换一瓶酒,然后再喝完这瓶酒,得到一个空瓶。以此类推,我们可以统计得到答案。福再度分析:时间复杂度:O(b/e),因为e≥2,而循环迭代时,每次 b 的变化原创 2020-08-11 21:43:02 · 1404 阅读 · 0 评论 -
LeetCode441:排列硬币(二分查找)
LeetCode441:排列硬币()1、你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。2、给定一个数字 n,找出可形成完整阶梯行的总行数。3、n 是一个非负整数,并且在32位有符号整型的范围内。方法一:复杂度分析:时间复杂度:O(N)空间复杂度:O(1) /** * 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 * 给定一个数字 n,找出可形成完整阶梯行的总行数。 *原创 2020-08-11 20:50:38 · 390 阅读 · 0 评论 -
LeetCode205:同构字符串(字符串-Map集合,查找表)
LeetCode205:同构字符串(字符串-Map集合,查找表)1、给定两个字符串 s 和 t,判断它们是否是同构的。2、如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。方法一:同构字符串的性质:同构字符串中,同一个位置的字符在本串中第一次出现的位置相同。不同构的情况:我们假设拿s串和t串作对比1.s串中相同的字符,对应的t串中的字符并不相等2.s串中不同的字符原创 2020-08-10 21:58:03 · 183 阅读 · 0 评论 -
LeetCode58:最后一个单词的长度(字符串)
LeetCode58:最后一个单词的长度(字符串)1、给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。2、如果不存在最后一个单词,请返回 0 。3、说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。方法一:字符串split()操作:1、通过空格进行分割成字符串数组,然后返回最后一个字符串的长度2、复杂度分析:时间复杂度:O(N),字符串分割操作。空间复杂度:O(K) /原创 2020-08-10 20:54:46 · 123 阅读 · 0 评论 -
LeetCode1025:除数博弈(归纳-动态规划)
LeetCode1025:除数博弈(归纳-动态规划)方法一:归纳法:前人栽树,后人乘凉。1、数字N如果是奇数,它的约数必然都是奇数;若为偶数,则其约数可奇可偶。2、无论N初始为多大的值,游戏最终只会进行到N=2时结束,那么谁轮到N=2时谁就会赢。3、因为爱丽丝先手,N初始若为偶数,爱丽丝则只需一直选1,使鲍勃一直面临N为奇数的情况,这样爱丽丝稳赢;N初始若为奇数,那么爱丽丝第一次选完之后N必为偶数,那么鲍勃只需一直选1就会稳赢。4、综述,判断N是奇数还是偶数,即可得出最终结果!复杂度分原创 2020-08-10 20:15:08 · 303 阅读 · 0 评论 -
LeetCode303:区域和检索 - 数组不可变(暴力-缓存-动态规划)
LeetCode303:区域和检索 - 数组不可变(暴力-缓存-动态规划)1、给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。方法一:暴力求解:1、每次调用 sumrange 时,我们都使用for循环将索引 i到 j之间的每个元素相加。2、复杂度分析时间复杂度:每次查询的时间 O(n),每个 sumrange 查询需要 O(n) 时间。空间复杂度:O(1),请注意,nums 是对 nums 的引用,不是它的副本。priva原创 2020-08-10 18:34:14 · 187 阅读 · 0 评论 -
LeetCode392:判断子序列(动态规划-双指针)
LeetCode392:判断子序列(动态规划-双指针)1、给定字符串 s 和 t ,判断 s 是否为 t 的子序列。2、你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。方法一:动态规划:1、参照最长公共子序列,求出最长公共子序列,然后原创 2020-08-10 16:31:42 · 250 阅读 · 0 评论 -
LeetCode 53:最大子序和(动态规划)
LeetCode 53:最大子序和(动态规划)1、输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。2、动态规划分析:3、复杂度分析:时间复杂度:O(N)空间复杂度:O(N),使用了一维数组。 /** * 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 * 动态规划:确定状态、状态转移方程,初始化状态,进行输出。 * @param nums * @return原创 2020-08-10 15:34:13 · 227 阅读 · 0 评论 -
LeetCode1143:最长公共子序列(动态规划)
LeetCode1143:最长公共子序列(动态规划)1、给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。2、 /** * 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 * 动态规划:确定状态、状态转移方程,初始化状态,考虑输出 * @param text1 * @param text2 * @return */ public int longestC原创 2020-08-10 12:29:27 · 331 阅读 · 0 评论 -
LeetCode5:最长回文子串(暴力-动态规划-中心扩散)
LeetCode5:最长回文子串(暴力-动态规划)1、给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。方法1:暴力求解:1、根据回文子串的定义,枚举所有长度大于等于 22 的子串,依次判断它们是否是回文。2、记录最长回文子串时,可以只记录“当前子串的起始位置”和“子串长度”,不必截取。3、复杂度分析:时间复杂度:O(N^3),枚举字符串的左边界、右边界,然后继续验证子串是否是回文子串,这三种操作都与 N相关。空间复杂度:O(1),只使用到常数个临时变量原创 2020-08-09 22:13:50 · 353 阅读 · 0 评论 -
冒泡排序
package com.company;public class Sort<E extends Comparable<E>> { /** * 冒泡排序:交换排序:两两进行比较,一趟比较结束最后一个元素为最大值(或最小值) * 时间复杂度:O(N*N) * 空间复杂度:O(1) * @param nums * @param n */ public void BubbleSort(E[] nums,int n){原创 2020-07-23 20:53:48 · 78 阅读 · 0 评论 -
字符串的循环左移(字符串)
字符串的循环左移1、把 字符串的str的前k个字符移动到str的尾部方法1:暴力法每次循环左移一位,循环k次时间复杂度O(kN),空间复杂度O(1) /** * 字符串的循环左移:把字符串str的前k个字符移动到字符串str的尾部 * 暴力法 * @param str * @return */ public String ReverseString(String str,int k){ for(int i=0;i&l原创 2020-07-19 20:41:44 · 1467 阅读 · 0 评论 -
最大连续子数组(数组-分治法)
最大连续子数组(分治法)方法1:暴力求解时间复杂度O(N^3) /** * 求解最大连续子数组:暴力求解,计算出每一个子数组的和,更新最大值 * @param nums * @return */ public int maxAddSub(int[] nums){ int max = nums[0]; for(int i = 0;i<nums.length;i++){ for(int j原创 2020-07-19 19:59:23 · 943 阅读 · 0 评论 -
LeetCode35:搜索插入位置(数组-二分查找法)
搜索插入位置1、给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。2、假设数组中无重复元素。方法1:暴力求解1、从数组的左边遍历到右边,如果遇到相等的元素,直接返回下标;2、遇到第 1 个严格大于 target 的元素,返回这个元素的下标;3、如果数组里所有的元素都严格小于 target,返回数组的长度 len。时间复杂度O(N),空间复杂度O(1)。 /** * 暴力求解:循环一遍数组如果遇到相同tar原创 2020-07-19 16:00:57 · 417 阅读 · 1 评论 -
LeetCode9:回文数(栈-字符串)
回文数1、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。方法1:转化为字符串 /** * 判断一个数字是否是回文数:转化为字符串,通过双指针 * @param x * @return */ public boolean isP原创 2020-07-18 19:23:19 · 132 阅读 · 0 评论 -
LeetCode7:整数反转(栈-字符串)
整数反转1、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。2、假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:通过栈和字符串来处理都不是最好的办法,我们每次只需要拿到数字的最后一个数即可,通过取模和除法运算即可。 /**原创 2020-07-18 18:51:47 · 437 阅读 · 0 评论 -
LeetCode119:杨辉三角II(递归-动态回归)
杨辉三角II1、给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。2、在杨辉三角中,每个数是它左上方和右上方的数的和。3、输入: 3输出: [1,3,3,1]方法1:递归/** * 杨辉三角:递归:行数从0开始 * @param rowIndex * @return */ public List<Integer> getRow(int rowIndex) { List<Integer> r原创 2020-07-17 22:05:27 · 221 阅读 · 0 评论 -
LeetCode118:杨辉三角(递归-动态规划)
杨辉三角1、给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。2、在杨辉三角中,每个数是它左上方和右上方的数的和。方法1: /** * 生成杨辉三角:在杨辉三角中,每个数是它左上方和右上方的数的和。 * 前两行都为1,从第三行开始,每行的除了头尾元素和结尾元素为1外,中间位置j的元素等于前一行j-1和j位置的元素之和。 * 用一个pre队列保存前一行元素,依次遍历生成杨辉三角。 * @param numRows * @return原创 2020-07-17 18:04:26 · 710 阅读 · 0 评论 -
LeetCode108:将有序数组转化为二叉搜索树(二叉树与递归)
将有序数组转化为二叉搜索树1、将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。2、本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 /** * 将一个有序数组转换成一颗高度平衡的二叉搜索树 * @param nums * @return */ public TreeNode sortedArrayToBST(int[] nums) { if(nums.length == 0){原创 2020-07-15 22:18:26 · 237 阅读 · 0 评论 -
LeetCode110:平衡二叉树(二叉树与递归)
平衡二叉树 /** * 判断一颗二叉树是否是一个高度平衡二叉树:自顶向下递归:暴力求解 * 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 * @param root * @return */ public boolean isBalanced(TreeNode root) { if(root == null){ return true; } //所有子树都需要满原创 2020-07-13 22:24:05 · 125 阅读 · 0 评论