算法学习
文章平均质量分 63
昆昆欧粑粑
这个作者很懒,什么都没留下…
展开
-
蓝桥杯基础练习——芯片测试
问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。 每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。 给出所有芯片的测试结果,问哪些芯片是好芯片。输入格式 输入数据第一行为一个整数n,表示芯片个数。 第二行到第n+1行为n*n的一张表,每...原创 2018-03-26 19:52:55 · 412 阅读 · 0 评论 -
最长公共子序列与最长连续公共子序列(java)——动态规划法
最长公共子序列:字符串a:"android"。字符串b:"random"。最长公共子序列为:ando最长连续公共子序列为:and,因为o和and之间隔开了。思想:使用动态规划法,用一个二维数组,i 行表示当前选中s1的前 i 字符,列 j 表示当前选中s2的前 j 个字符,dp[i][j]表示当前i和j情况下最大子序列有多少个。(连续子序列使用max来保存最大)。动态规划递推公式: ...原创 2018-05-25 13:09:23 · 3804 阅读 · 2 评论 -
旋转图像(二维数组的旋转)——LeetCode数组算法题
旋转图像给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 ...原创 2018-06-20 23:13:40 · 2917 阅读 · 1 评论 -
鸡兔同笼(附java代码)——穷举法解题
穷举法:暴力破解,n层for循环。枚举每一种可能。例题:鸡兔同笼:一个笼子有35个头,94只脚,问鸡和兔各有多少?解题:数学方法:设鸡i只,兔j只,方程:i + j = 35 ; 2 * i + 4 * j = 94。解题思路:鸡和兔加起来35只,所以算每一种可能的脚的个数,符合就输出就可以了代码如下: public static void main(String[] args) { j...原创 2018-06-18 13:25:32 · 8358 阅读 · 2 评论 -
斐波那契数列——递归和递推双解决
斐波那契数列:第n项等于n-1和n-2项之和F(n) = F(n-1)+ F(n-2);解题:关键代码如下递归解决: public static void main(String[] args) { int m = f(18); System.out.println(m); } public static int f(int n) { if (n == ...原创 2018-06-18 13:52:00 · 1072 阅读 · 0 评论 -
分治算法——五大常用算法之一
分治法首先看一下二分搜索:一串数字,从中间分成两半,再两半……这样查找就是分治思想:把一个问题分解成若干个一样的小块。1、基本概念:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题。直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。2、分治经典问题1.二分搜索2.大整数乘法3.Strassen矩阵乘法4.棋盘覆盖问题5.合并排序6.快速排序7.线性时间选...原创 2018-06-18 15:44:05 · 676 阅读 · 0 评论 -
爬楼梯——动态规划(java)
爬楼梯假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 步 + 1 步2. 2 步示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 步 + 1 步 + 1 步2. 1 步 + 2 步...原创 2018-06-18 16:09:58 · 2782 阅读 · 0 评论 -
动态规划——五大常用算法之一
动态规划1、基本概念:动态规划就是:每走一步,都会根据之前的情况来决定这一步的走向,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。2、基本思想与策略:与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子...原创 2018-06-18 16:19:50 · 1503 阅读 · 0 评论 -
打家劫舍——动态规划(java实现)
打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3...原创 2018-06-18 16:20:34 · 4167 阅读 · 0 评论 -
贪心算法——五大常用算法之一
贪心算法一、基本概念: 在对问题求解时,总是做出在当前看来是最好的选择。不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足...原创 2018-06-20 16:34:45 · 6554 阅读 · 0 评论 -
4个基本算法思想:穷举、递推、递归、概率
4个基本算法思想:穷举、递推、递归、概率内容:这4个基本算法思想是解决基础问题的很实用的方法。这里开始其实就已经是把所有需要的知识准备好了,之后就要开始解题了。此文为初级算法总结的子篇第六章——4个基本算法思想。一、穷举暴力破解,n层for循环。列举每一种可能。例题:鸡兔同笼:一个笼子有35个头,94只脚,问鸡和兔各有多少?解题:鸡兔同笼二、递推:简单的动态规划,根...原创 2018-07-29 17:17:09 · 2021 阅读 · 0 评论 -
初级算法学习步骤
前言零散整理一个多月终于整理完了。。。。这是一篇初级算法学习的步骤总结,或许可以帮助你怎么去接触算法阅读本文需要一定java语法基础和api文档查看基础,但算法其实看重的是思想而不是语言,所以都可以借鉴。本人大二,参加过蓝桥杯。一直没时间吧之前的总结整理出来,现在准备整理一下用java做算法的一些东西……学习了两个月左右算法,从啥都不会到小白再到算是初级……做一个总结,请高手多多指...原创 2018-07-29 18:51:51 · 10441 阅读 · 1 评论 -
把一个用数组表示的整数加一(十进制进位模拟)
题目:给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示...原创 2018-08-15 11:37:33 · 972 阅读 · 0 评论 -
把字符串颠倒,并把字符串里的每个单词再颠倒(c语言实现)
题目:有一个字符串:"student a am i",要把它变成:“i am a student”c语言实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>char* reserve(char* p, int len...原创 2018-08-18 14:30:04 · 2588 阅读 · 0 评论 -
判断元素出栈入栈的合法性
一个例题: 栈的存储是先入后出,所以比如是12345入栈,那么出来就是54321.但也可以先1234然后4出来,5入栈,再全出,就是45321的顺序。如何判断这个顺序:每次入栈的时候,都试探一下现在出栈是否符合对应的出去的顺序。就可以了。c++代码如下 #include <iostream>#include <assert.h>#include &...原创 2018-08-18 17:28:29 · 668 阅读 · 0 评论 -
C语言实现heapify算法堆转换
heapify算法主要是把一个数组按堆的顺序排好,可以实现一定的优先级,下面是对数组堆化参考://下移操作:void AdjustDown(MH* mh, int k){ while (k * 2 <= mh->count) { int j = k * 2; if (j + 1 <= mh->count && mh->data[j...原创 2018-08-25 17:26:57 · 967 阅读 · 0 评论 -
堆排序——C语言实现
如何构建堆请参照:堆——C语言实现堆排序://堆排序void sortHeap(int arr[], int n){ MH mh;//堆 initMaxHeap(&mh, n); for (int i = 0; i < n; i++) { insertMaxHeap(&mh, arr[i]); } for (int i = n - 1; i >...原创 2018-08-25 17:30:14 · 455 阅读 · 0 评论 -
蓝桥杯编程题——完美的代价——贪心算法(存在一定问题,希望各路大神纠正一下)
问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。 交换的定义是:交换两个相邻的字符 例如mamad 第一次交换 ad : mamda 第二次交换 md : madma 第三次交换 ma : madam (回文!完美!)输入格式 第一行是一个整数N,...原创 2018-05-07 19:42:19 · 1190 阅读 · 0 评论 -
海岸雷达问题(java实现)——贪心算法例题
海岸雷达问题:题目描述: 假定海岸线是一条无限延伸的直线,陆地在海岸线的一边,大海在另一侧。海中有许多岛屿,每一个小岛我们可以认为是一个点。现在要在海岸线上安装雷达,雷达的覆盖范围是r,也就是说大海中一个小岛能被安装的雷达覆盖,那么它们之间的距离最大为d。 我们使用平面直角坐标系,定义海岸线是x轴,大海在x轴上方,陆地在下方。给你海中每一个岛屿的坐标位置(x,y)和要安装的雷达所覆...原创 2018-05-07 19:35:24 · 2815 阅读 · 0 评论 -
回溯算法——五大常用算法之一
1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回到上一步还能执行的状态,尝试别的路径。 类似于走迷宫一样,假设我们到了每一个岔路口都规定,除了走过的地方,按照先往上走到底,如果不能走,在退回到上一个岔路口,走左边,如果不行再走右边,如果不行再走下面。每次退回就是每次的回溯,所以回溯法要保存每一次的状态。 ...原创 2018-05-20 15:55:21 · 3769 阅读 · 0 评论 -
蓝桥杯基础练习——龟兔赛跑预测
问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是...原创 2018-03-26 20:49:28 · 324 阅读 · 0 评论 -
蓝桥杯基础练习——回形取数
问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。输出格式 输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。样例输入3 31 2 34 5 67 8 9样例输出1 ...原创 2018-03-28 00:03:07 · 1608 阅读 · 0 评论 -
(转)五大常用算法:分治、动态规划、贪心、回溯和分支界定
看到一篇非常好的讲解五大算法的博客下面是内容分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一...转载 2018-04-30 14:59:02 · 297 阅读 · 0 评论 -
分治算法——附棋盘覆盖问题的java代码实现
分治算法基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模...原创 2018-04-30 15:51:34 · 8662 阅读 · 3 评论 -
汉若塔问题(基础汉若塔)——java实现
汉诺(Hanoi)塔问题: 古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。 这个问题需要用到...原创 2018-04-24 21:57:52 · 974 阅读 · 0 评论 -
蓝桥杯基础练习——FJ的字符串(java)
问题描述 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗?输入格式 仅有一个数:N ≤ 26。输出格式 请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。样例输入3样例输出ABACABA下面是代码:p...原创 2018-05-09 15:05:37 · 1236 阅读 · 0 评论 -
蓝桥杯 历届试题——核桃的数量(最小公倍数与最大公约数)(java)
问题描述小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:1. 各组的核桃数量必须相同2. 各组内必须能平分核桃(当然是不能打碎的)3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)输入格式输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<30)输出格式输出一个正整数,表示每...原创 2018-05-09 15:10:15 · 325 阅读 · 0 评论 -
蓝桥杯基础练习——Huffuman树
问题描述 Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。 2. 重复步骤1,直到{pi}中只剩下一个数。...原创 2018-05-09 15:21:14 · 291 阅读 · 0 评论 -
java实现数组的快速排序
快速排序 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。基本步骤为:1.设定关键字,划分成两个数组,比关键字小的放在一边,大的放在另一边2.我们选择设置数组最右端为关键字3.递归实现快速排序,通过递归给每一个...原创 2018-04-24 22:52:51 · 702 阅读 · 0 评论 -
haffman哈夫曼树——贪心算法(java)
接下来学习了哈夫曼树,总结一下哈夫曼树:了解Huffman算法之前,我们先介绍一下一颗树的构造价值:构造价值指的是,在一个树当中,如果有n层,那么每层的系数为1、2、3……n,然后吧每个叶子节点的构造价值乘以系数,总和就是这棵树的构造总价值,这也就叫做哈夫曼树的构造价值,我们看一个例子:对于这一棵树,我们计算一下他的哈夫曼构造价值:这里叶子节点一共有3个:6和13和17所以价值等于6*2 + 13...原创 2018-05-09 19:58:01 · 10764 阅读 · 4 评论 -
LeetCode——电话号码的字母组合(java)——回溯算法
问题描述:电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].说明:尽原创 2018-05-19 11:34:15 · 3686 阅读 · 1 评论 -
LeetCode——生成括号(java)——回溯算法
生成括号给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]这也是简单的回溯算法,先写n个左括号,然后就写右括号,每当完成一组之后,就吧字符串存起来。然后再倒退步骤到写第n-1个左括号,然后写右括号,在...原创 2018-05-19 23:17:19 · 2690 阅读 · 0 评论 -
LeetCodd——全排序(java)——回溯算法
全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 思路:还是排列组合问题,用回溯法,但注意的是,遇到重复的要跳过代码如下:package 中级回溯;import java.util.ArrayList;impo...原创 2018-05-19 23:20:48 · 1470 阅读 · 0 评论 -
0-1背包问题(动态规划)附例题详解——java实现
0-1 背包问题(java实现)代码在最后 给定 n 种物品,每种物品有对应的重量weight和价值value,一个容量为 maxWeight 的背包,问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?面对每个物品,我们只有选择拿取或者不拿两种选择,不能选择装入某物品的一部分,也不能装入同一物品多次。使用动态规划思想,很容易想到,我们需要一个空间来储存:从0号物品开始,对于每...原创 2018-05-07 11:25:56 · 19925 阅读 · 4 评论 -
LeetCodd——子集(java)——回溯算法
子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]思路:这依然是一道排列组合的题目,定义一个标记数组,表示每个元素取不取,具体看代码:package 中级...原创 2018-05-20 15:08:40 · 1622 阅读 · 2 评论 -
LeetCodd——单词搜索(java)——回溯算法
单词搜索给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED",...原创 2018-05-20 15:22:36 · 1165 阅读 · 0 评论 -
LeetCode——实现strStr()
实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needl...原创 2019-02-18 16:53:25 · 158 阅读 · 0 评论