
算法进阶
算法
Αиcíеиτеǎг
柯南
展开
-
金山办公2020校招-对称数字
输入一个不含前导零的数字,判断这个数字是不是对称数字,如果为对称数字则输出“Yes”,否则输出“No”。定义如果一个数字 x 从左向右读和从右向左读相同,则这个数字是对称数字。比如:输入是1569651、5005都是对称数字,而25则不是一个对称数字。#include <iostream>using namespace std;int main(){ int n; ...原创 2020-02-13 20:24:51 · 233 阅读 · 0 评论 -
剑指offer(十二)数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路如下:首先这个需要考虑几种情况1、两者同时为0,即0的0次方,若都为0则不用算了,退出程序即可2、当base = 1,那么无论exponent为多少,结果都为13、当exponent为1,那么无论base为多少,结果都为ba...原创 2020-02-12 14:46:09 · 153 阅读 · 0 评论 -
剑指offer(十一)二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。1、最容易也是容易死循环的一种解法先判断整数二进制表示中最右边的一位是不是1,接着把输入的整数右移一位,此时处于最右边数起的第二位被移到最右边了,再判断是不是1。这样每次移动一位,直到整个整数变成0为止。正数这样是没有问题的。但是负数右移是以1补位的,因此,会一直补1,陷入死循环。class Solution {p...原创 2020-02-10 11:10:25 · 166 阅读 · 0 评论 -
剑指offer(九)变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n)=f(n-1)+f(n-2)+…+f(1)因为f(n-1)=f(n-2)+f(n-3)+…+f(1)...原创 2020-02-09 14:40:17 · 138 阅读 · 0 评论 -
剑指offer(八)跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。number等于1时,1种跳法number等于2时,2种跳法number等于3时,3种跳法number等于4时,5种跳法即斐波那契数列公式为f(n) = f(n - 1) + f(n - 2);但是用递归不太好直接用循环即可。class Solution...原创 2020-02-09 14:09:34 · 149 阅读 · 0 评论 -
剑指offer(七)斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39用递归会超出内存用循环中直接相加就可以了class Solution {public: int Fibonacci(int n) { int pre1 = 0; int pre2 = 1; int su...原创 2020-02-09 13:51:56 · 160 阅读 · 0 评论 -
剑指offer(五)用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是先进后出要实现的是在队尾插入节点在队首删除节点首先呢,可以拿一个例子来看,首先通过一个例子来分析,比如插入一个元素a,可以先将它插入到栈1之中。栈1中目前的元素为{a},栈2为空。再压入两个元素b,c。同上。此时栈1的元素为{a,b,c}。栈2为空。现在要删除啦。想要删除的元素为队...原创 2020-02-09 12:26:59 · 144 阅读 · 0 评论 -
剑指offer(二)替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:首先需要统计一下数组的长度以及空格数这样的话,可以从数组的后面进行前推第一个指针指向数组的初始结尾处,第二个指针指向新数组(空格替换为%20)的结尾处当第一个指针指向空格时,第一个指针向前推三个分别为0,2,%这样...原创 2020-02-09 09:07:29 · 141 阅读 · 0 评论 -
剑指offer(一)二维数组的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:嗯,这道题就是在找规律啦!在每次的分析中,都找右上角的数字(也可以左下角的),这样的好处是可以防止重叠区域的出现。如果右上角的数字等于target那么就找到了如果右上角的数字大于ta...原创 2020-02-08 20:12:48 · 163 阅读 · 0 评论 -
LeetCode- 两个数组的交集 II
两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。进阶...转载 2020-02-07 21:18:07 · 269 阅读 · 0 评论 -
LeetCode-移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。思路:number为标志数,如果不是0,则i往后走如果是0,则i后面的数字替代前面的数字,即跳过0最后将空位补0class Solution { ...原创 2020-02-07 20:25:45 · 377 阅读 · 0 评论 -
LeetCode-加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。class S...原创 2020-02-07 19:35:57 · 190 阅读 · 0 评论 -
LeetCode-反转字符串
一个从头部开始,一个从尾部开始,进行交换。到中间值结束交换操作class Solution {public: void reverseString(vector<char>& s) { int len = s.size(); int j = 0,t; for(int i = len - 1,j = 0 ; i >...原创 2020-01-17 12:26:54 · 168 阅读 · 0 评论 -
LeetCode-旋转图像
示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 2:给定 matrix =[ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16]],...原创 2020-01-17 11:40:53 · 247 阅读 · 0 评论 -
LeetCode-两数之和
最简单的思路就是暴力法,两遍循环的方式遍历numsclass Solution {public: vector<int> twoSum(vector<int>& nums, int target) { //暴力法 int i,j; for(i = 0 ; i < nums.size() ; i++) ...原创 2020-01-17 10:54:50 · 150 阅读 · 0 评论 -
LeetCode-买卖股票的最佳时机II
这道题的思路是这样的,使用贪心算法求最优解简单来说就是,如果,今天买了股票价格较低,第二天高,那么就可以赚到钱,也就是我今天就可以买,然后明天就卖。如果第二天价格低,那么我们今天就不买它了,这样第二天也不卖(这样不会亏本呀)。如此下去,等到了最后,每次买卖,都是赚的,蚊子再小也是肉,就成为最优解啦。贪心算法思想就是求最优解的最佳思路。虽然会出现那种,我后天可能卖的价更高,但是但是,全局最优解...原创 2020-01-16 22:27:25 · 173 阅读 · 0 评论 -
LeetCode-删除排序数组中的重复项
本题思路如下:这道题,略显复杂的地方在于,要求不能使用额外的数组空间,且复杂度为O(1)。因此只能原地修改输入数组。1、首先判断数组是否为空,如果为直接返回。2、若不为空,则给定一个number,作为指标进行判断。3、数组从0开始,如果nums[number]不等于num[I],说明,此时出现重复值。将number加1,并将nums[I]值赋值给number对应的nums上,将重复的值...原创 2020-01-16 22:18:20 · 144 阅读 · 0 评论 -
LeetCode-存在重复元素
这道题的思路如下:1、首先对数组进行排序2、for循环,可以通过与后面的值进行比较,如果相同可以直接返回true3、如果for循环结束,仍未返回true值,说明元素都不相同,返回falseclass Solution {public: bool containsDuplicate(vector<int>& nums) { so...原创 2020-01-16 22:09:21 · 284 阅读 · 0 评论 -
LeetCode-只出现一次的数字
这道题的思路如下:首先对该数组进行排序,只有一个元素是出现过一次,其他均为两次。所以,对其排序之后,即以下这个状态:如果出现过两次,那么在数组的循环累加两个之后,那么一定会和它后面的那一个想等。如果出现了与后面一个值不相等的话,即为落单的一个值。如果数组累加到倒数第三位和第二位,仍未找到落单,那么落单值为最后一位(数组长度一定是奇数个)代码实现如下:class Solution {...原创 2020-01-16 22:04:59 · 135 阅读 · 0 评论 -
粒子群算法求解二元函数极值-附带800字程序说明
问题描述:给定一个非线性函数f(x,y) = sin(sqrt(x2+y2))/(sqrt(x2+y2)) + exp((cos(2PIx)+cos(2PIy))/2) - 2.71289,使用粒子群算法来求这个二元函数的极大值。求解思路:通过在MATLAB中绘制该二元函数的图形后,可以发现函数存在很多的局部极大值点,极限位置位于坐标原点(0,0),在(0,0)附近取到极大值,极大值与1十分...原创 2019-12-26 08:25:38 · 6694 阅读 · 0 评论 -
二分与贪心算法(POJ4110圣诞老人的礼物,POJ 3104 烘晾衣服)
1.二分查找 前提是: 已经排序好的序列 在查找元素时, 首先与序列中间的元素进行比较 • 如果大于这个元素, 就在当前序列的后半部分继续查找 • 如果小于这个元素, 就在当前序列的前半部分继续查找 • 直到找到相同的元素, 或者所查找的序列范围为空为止 伪码描述 left = 0, right = n -1 while (left mid = (left + right原创 2018-02-02 20:35:29 · 2012 阅读 · 0 评论 -
动态规划典型例题详解(最长公共子序列(POJ1458), Help Jimmy(POJ1661))
例题1:最长公共子序列(POJ1458) 给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致。 输入 abcfbc abfcab programming contest abcd mnp 输出 4 2 0解题思路: 遇见动归问题,第一步需要考虑状态是什么。 输入两个串s1原创 2018-01-27 12:12:30 · 674 阅读 · 0 评论 -
深度优先搜索DFS详解(百练2815 城堡问题)
我们先说说深搜到底是怎么工作的。 就是我们在解决一些问题的时候,会牵涉到各种各样的状态,然后各个状态之间可以互相转移,一个状态可以到达另外一个状态, 那往往我们就会把状态之间互相的可达性画成一个图, 那么对于深搜来讲的话,实际上就是去 遍历整个图的这么一个过程。Dfs(v) { if( v 访问过) } return; 将v标记为访问过; 对和v相邻的每个点u: Dfs(u); ...原创 2018-02-05 16:38:51 · 603 阅读 · 0 评论 -
动态规划详解(数字三角形POJ1163)
7 3 8 8 1 0 2 7 4 44 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大。路径上的每一步都只能往左下...原创 2018-01-26 11:17:21 · 12104 阅读 · 0 评论 -
sort自定义排序
1.SORT介绍 用于C++中,对给定区间所有元素进行排序。 使用的排序方法类似于快排的方法,时间复杂度为n * log2(n),执行效率较高 头文件#include&lt; algorithm&gt; 2.sort使用方法 sort函数有3个参数,sort(first, last,cmp) 其中,first是元素的起始地址,last是结束地址,cmp是排序的方式。对(first,la...原创 2018-03-17 11:08:13 · 7034 阅读 · 0 评论 -
iterator vector
在介绍vector之前,我们先来说一下STL中的iterator。 除了使用下标来访问vector对象的元素外,标准库提供了另一种访问元素的方法“迭代器”。 在STL中,大体可以分为容器(顺序容器、关系容器),迭代器,算法三大类。 而iterator可以看作是STL容器的指针,可以更为方便地访问容器里的元素。1.iterator的基本操作 每个标准库容器类型都定义了一个名为iterat...原创 2018-03-17 16:53:03 · 1912 阅读 · 0 评论 -
STL之map
1.map简介: map是STL中的一个关联式容器,可以建立key(first)和value(second)一对一的联系,由key映射到valuemap内部自建了一颗红黑二叉树,可以对数据进行自动排序,所以map里的数据都是有序的,这也是我们通过map简化代码的原因使用map需要声明头文件#include&lt; map&gt;2.map特点: 自动建立 key-value的对应关...原创 2018-03-17 21:29:49 · 307 阅读 · 0 评论 -
map例题之未检录人数
例题1: 描述 题目描述: STL库中有许多非常实用的函数,如sort,set,map,vector,queue等。 运动会开始了,1117势力因为忙于出题,某些有项目的同学没有及时赶到检录处检录,广播中播放了n次未及时检录的同学的名单。现在,需要聪明的你统计出共有多少个人未及时检录。输入: 第一行读入一个n(1&lt;=n&lt;=100000)接下来n行每行读入...原创 2018-03-18 17:12:01 · 390 阅读 · 0 评论 -
STL之set
1.set介绍 set容器是一种实现了平衡二叉树的数据结构,容器中的数据不能重复,即每个数据都是唯一的,并且会对存进去的数据进行自动排序。 构造set集合的主要目的是为了快速检索,去重与排序,使用set前,需要在程序头文件中包含声明#include&lt; set&gt;2.set常用函数insert(): 插入元素erase(): 删除元素find(): 返...原创 2018-03-18 22:42:13 · 319 阅读 · 0 评论 -
set例题
题目描述: STL库中有许多非常实用的函数,如sort,set,map,vector,queue等。读入n个数,要求输出出现的不同数字的个数输入: 第一行读入一个 n ( 0#include&lt;iostream&gt;#include&lt;set&gt;using namespace std;typedef long long ll;int main(){ ...原创 2018-03-19 18:58:17 · 899 阅读 · 0 评论 -
蓝桥杯-错误票据
题目描述: 某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。 要求程序首先输入一个整数N(N&lt;100)表示后面数据行...原创 2018-03-19 20:07:37 · 627 阅读 · 0 评论 -
STL之stack、queue
1.stack简介: stack是STL中的一种容器适配器,被设计来用于操作先进后出(First In Last Out,FILO)结构的情景,在这种情况下,元素的插入和删除都只能在容器的尾部进行。 元素只能在这个特定的容器的后面,也就是栈的顶部,进行出栈和入栈操作。 使用stack需要声明头文件#include&lt; stack&gt;2.stack的构造 构造satck:默认构造...原创 2018-03-20 19:29:09 · 395 阅读 · 0 评论 -
愚人节的礼物
题目描述: 四月一日快到了,Vayko想了个愚人的好办法——送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Vayko为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。用()表示一个盒子,B表示礼物,Vayko想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。输入: 本题目包含多组测试,请处理到文件结束。...原创 2018-03-21 15:00:09 · 534 阅读 · 1 评论 -
算法专题之DFS
1.DFS是一种搜索算法,对每一个可能的分支路径深入到不能再深入为止,而且,每一个结点只能访问一次。 2.基本思路:从图中的某顶点a出发 - 访问顶点a - 依次从a的未被访问的邻接点出发,对图进行深度优先遍历,直至图中和a有路径相通的顶点都被访问 - 若此时图中尚有顶点未被访问,则从一个未访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 3.举个例子吧! 输出1~n的...原创 2018-03-26 19:22:53 · 555 阅读 · 0 评论 -
分子量-Molar Mass,ACM/ICPC Seoul 2007,UVa1586
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol),例如C6H5OH的分子量为94.108g/mol。/* 思路1: 将除了CHON的其他元素的值设为0 如果mass[buf[i]]为真,证明是以上字符之一 如果它的下一位是字符,则直接累加即可 ...原创 2018-01-25 08:54:55 · 371 阅读 · 0 评论 -
得分-Score,ACM/ICPC Seoul 2005,UVa1585
给出一个由O和X组成的串(长度为1~80),统计得分。每个O的分数为目前连续出现的O的个数,X的得分为0。例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3。 方案1 思路:在这个方法中,如果一个字母为O判断下一个是不是也是O。如果都是O,那么就a[i]就是累加,不是的话,就为1#include&amp;lt;iostream&amp;gt;#include&amp;lt;cstri...原创 2018-01-25 09:01:11 · 516 阅读 · 0 评论 -
2019年蓝桥杯开“刷题”报告!
嗯,新一届的蓝桥杯又要开启了。自从上次比赛完蓝桥杯就把算法给搁置了,昨天,之前的指导老师找到我,给我在蓝桥杯官网上授权了一个vip账号,也就意味着,新的阶段又要开启了。经过这将近三年的敲代码生活,越发觉得算法是编程的精髓,是灵魂所在呀。今天也算是给自己立下一个小小的开题报告吧!希望自己可以每天都可以抽出来点时间更新博客。之前的算法博客也挺水的,但是也是自己一步步划过来的。以后的就用jav...原创 2018-10-31 16:27:55 · 4370 阅读 · 0 评论 -
数列排序-java
/*基础练习 数列排序 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1&lt;=n&lt;=200输入格式 第一行为一个整数n。 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式 输出一行,按从小到大的顺序输出排序后的数列。样例输入58 3 6 4 9样例...原创 2018-11-24 17:28:31 · 993 阅读 · 0 评论 -
实现顺序栈的初始化、入栈和出栈操作
编写一个程序实现顺序栈的初始化、入栈和出栈操作;//方案1# include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;iostream&amp;gt;using namespace std;# define STACK_INIT_SIZE 20# define stackincrement 20/*不是动态分配存储空间,所以需要定义一个增量*/typedef int原创 2018-05-04 09:49:59 · 42567 阅读 · 1 评论 -
铁轨(Rails,ACM/ICPC CERC 1997.UVa 514)
有n节车厢从A方向驶入车站,按进站顺序编号1~n。 现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。 为了重组车厢,可以借助中转站C。 C是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。 对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。 换句话说,在任意时刻,只有两种选择:A→C和C→B。 请编程判断判断...原创 2018-03-09 13:41:23 · 1561 阅读 · 0 评论