算法
凯瑟Kaiser
这个作者很懒,什么都没留下…
展开
-
玩家传递信息
小 A 和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。每轮信息必须需要传递给另一个人,且信息可重复经过同一个人给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小.原创 2021-10-04 09:37:06 · 210 阅读 · 0 评论 -
跳台阶问题
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。public static int jump(int[] nums) { int count =0; for (int i=nums.length-1;i>=0;i--){ if (i == 0) { break.原创 2021-09-26 18:33:26 · 147 阅读 · 0 评论 -
乘积最大问题
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。求最大乘积,看到这种求最值问题的,首先想到的就是用动态规划。1、如果n为1,dp[1] = 1;2、如果n大于等于2,它的状态方程为,dp[i] = Max(dp[i],dp[j]*[i-j]),但dp[j]也是经过拆分的,需要判断合并是否比拆开乘积更大。代码如下:public static int integerBreak(int n) { .原创 2021-09-26 17:25:24 · 647 阅读 · 0 评论 -
背包 问题
/*** 背包问题:有n个物品和一个大小为m的背包,给定数组A表示每个物品的大小和数组V表示每个物品的价值* 问最多能装入背包的总价值是多大?* 转换问题为:从n个商品中做选择,当包的大小为m时的最大价值* 状态F(i,j):从i个商品中做选择,当包的大小为j时的最大价值* (1)A[i-1]<=j: 不放:F(i,j)=F(i-1,j) 放:F(i,j)=F(i-1,j-A[i-1])+V[i-1]* F(i,j) = Math.max(F(i-1,j),F(i-1,j-A[i-1.原创 2021-08-22 17:04:41 · 131 阅读 · 0 评论 -
股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?解法一:暴力解法两层循环,对于每一个数,都去计算它与前面的数差的最大值。public int maxProfit(int[] prices) { if(prices.length==0)return 0; int max_Profit=0; int price = 0; for(int i=1;i<prices.length;i++)原创 2021-07-30 18:22:14 · 95 阅读 · 0 评论 -
丑数问题来了
题目是这样的,我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。对于这个题呢,我们可以运用数学思维去解决,丑数是只包含质因子的数,那么可以反过来想,就是一个数乘以2、3或5得到该丑数。由于需要保持从小到大,所以取3种乘积情况下的最小值。对于三个乘系数不同可以设置三个指针 (每个指针都从第一个丑数的位置开始), 若每次取得的最小值与其中一个或多个相等,这多个指针都会移动(因为会出现由于不同乘积而得到的重复值)。运用动态规划解法如下: pu..原创 2021-07-29 21:21:37 · 81 阅读 · 0 评论 -
最长不含重复字符的子字符串
居然在剑指offer里刷到了这道题,记得虾皮一面的时候面试官就给了我这道题,当时思路有点混乱,没有做出来。今天刷到了之后,经过几番调试,终于做出来了。 这道题做法其实很多,我一开始就想着用map存储,但是无法获取下标,所以进展不下去,后面还是两层循环弄了出来。第二层循环从后往前,只要遇到相同的,长度len直接等于**i-j**。代码如下:public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArr.原创 2021-07-28 23:00:53 · 79 阅读 · 0 评论 -
把数字翻译成字符串
这几天做了一些关于数字的题,数字组合最小,数字翻译成字符串,数字的二进制运算。下面是其中一道:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。这道题也不说多难吧,就比较典型,既可以用递归也可以使用动态规划,看题解:0-25之内的数字都有对应的字母,这个区间内的数字,都可以进行重组。大于25或者小于10的数字都只有一原创 2021-07-24 12:54:51 · 106 阅读 · 0 评论 -
重建二叉树
今天刷了一下二叉树的题,刷到了重建二叉树,题是这样的:给出二叉树的先序和中序遍历序列,重建该二叉树。一说到二叉树的题,我们都知道递归是用得最多的,比如二叉树的前中后序遍历,用递归特别简单易懂。所以碰到二叉树的题,我们可以先用递归思路思考下,果不其然,这道题递归同样也适用,接下来讲解一下递归的思想:首先可以用list存储中序遍历数组的元素,用它存储的原因在于,后面可以查询下标;第二步, 从前序遍历数组中取出第一个元素,我们都知道它是根结点,所以二叉树的根结点就找到了;记录此时根结点的索引i原创 2021-07-22 19:24:05 · 65 阅读 · 0 评论 -
剪绳子问题
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。这是剑指offer里的一道题,一看最值问题大概率就是动态规划了,这道题也不例外,思考一会儿之后,我就确定了它可以利用动态规划的思想解决。可以理解成长度为i的绳子,分成j段时的最大乘积.原创 2021-07-21 19:53:10 · 89 阅读 · 0 评论 -
和为s的两个数字
文章目录前言一、题目二、题解三、代码前言一、题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。二、题解这道题其实可以设置两个指针,左指针left,右指针right;在大循环里设置left<right;1、如果nuns[left]+nums[right]==target,则输出nums[left],nums[right];2、如果nums[left]+nums[right]<target,因为是递增数组,原创 2021-07-17 17:46:28 · 61 阅读 · 0 评论 -
矩阵的顺时针旋转打印
今天第二次刷剑指offer,刷到了一个矩阵题,感觉挺有意思,想把它记录下来,题目是这样的输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。从四个方向打印,分析如下:(1)从左到右,top++;(2)从上到下,right–;(3)从右到左,bottom–;(4)从下到上,left++;代码如下: public static int[] spiralOrder(int[][] matrix) { if (matrix.length == 0) {原创 2021-07-14 20:26:50 · 111 阅读 · 0 评论 -
经典字符串例题
文章目录前言一、String、StringBuffer、StringBuilder三者的区别二、关于字符串的一些经典例题1.两个字符串的最长公共子串1.常规解法2.动态规划解法2.最长回文字符串1.常规解法2.动态规划解法3.字符串所有排列总结前言字符串虽然只是JAVA中的一种引用类型,深入学习,会发现关于字符串的问题真的不是一星半点,我们都知道String定义的是不可变的字符串,所以提供了StringBuilder和StringBuffer来对字符串进行修改,三者有什么区别呢?一、String、St原创 2021-07-10 15:53:57 · 752 阅读 · 0 评论 -
蓝桥杯--国赛题
1.将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方法?注意交换顺序视为同一种方法,例如 132 + 252 + 352 = 2019 与 132 + 352 +252 = 2019 视为同一种方法。static int count =0; public static void main(String[] args) { dfs(0, 45, 2019); System.out.println(count); } pri原创 2021-04-17 15:40:10 · 283 阅读 · 0 评论 -
搜索算法----DFS
今天来看看搜素算法之一-----深度优先搜索,对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。来看一些例题:1.有三个盒子,还有三个小球,要把每个小球放入三个袋子中,有多少种方法, 每个盒子的处理逻辑:尝试处理手里的每一张牌,拿一张牌放入盒子,再去处理下一个盒子。 public static void DFS(int[] box, int[] used, int idx) { //盒子全部处理完毕 if (idx == box.length...原创 2021-04-12 19:29:16 · 142 阅读 · 0 评论 -
蓝桥杯--省赛题4
今天来看道蓝桥杯的动态规划题:题目描述小蓝在一个 nn 行 mm 列的方格图中玩一个游戏。开始时,小蓝站在方格图的左上角,即第 11 行第 11 列。小蓝可以在方格图上走动,走动时,如果当前在第 rr 行第 cc 列,他不能走到行号比 rr 小的行,也不能走到列号比 cc 小的列。同时,他一步走的直线距离不超过 33。例如,如果当前小蓝在第 33 行第 55 列,他下一步可以走到第 33 行第 66 列、第 33 行第 77 列、第 33 行第 88 列、第 44 行第 55 列、第 44 行第原创 2021-04-10 22:28:02 · 519 阅读 · 0 评论 -
蓝桥杯--省赛题3
public static void main(String[] args) { //x 3/ 半分钟后吃掉一个Y 之后每隔一分钟吃掉一个Y //Y 2/ // X=10; Y=89; 60分钟后Y=? long x =10; long y=90; for (int i=1;i<=60;i++){ y-=x; if (i % 2 == 0) {...原创 2021-04-09 20:55:32 · 111 阅读 · 0 评论 -
蓝桥杯--省赛题2
//求[1,2020]有多少个2 public static void main1(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int count =0; for (int i=m;i<=n;i++){ int e = i;...原创 2021-04-09 20:47:45 · 53 阅读 · 0 评论 -
蓝桥杯--省赛题
//康威生命游戏 public static long sumisAliveCell(int[][] dp, long k) { int sum = 0; //k表示迭代代数 while (k > 0) { //设置一个二维数组,让它等于原始数组dp int[][] map = new int[dp.length][dp[0].length]; for (in...原创 2021-04-09 20:43:03 · 77 阅读 · 0 评论 -
七大排序算法
一、直接插入排序1、原理直接插入排序它的整个数组分为两个区间,即无序区间和有序区间,每次选择无序区间的第一个元素,在有序区间选择合适位置插入。可以把它看做是大牌游戏,每次摸取一张牌,点数小的自动放前面,大的那个后面。话不多说,下面来看它的代码实现:2.代码实现再来分析一下这个排序的性能,最坏时间复杂度o(N),最好时间复杂度o(N2),那么平均复杂度为o(N2)。它的空间复杂度为o(1),它是不需要开辟额外的空间的。可以看出,这个排序不会颠倒相同数字得相对位置,我们在排序时选择的是大于等于就放在该原创 2020-12-27 10:11:42 · 283 阅读 · 0 评论