
算法
爱编程的 小李
这个作者很懒,什么都没留下…
展开
-
c++查找与排序相关题目上
递归问题:找重复、找变化、找边界汉诺塔问题汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。#include<iostream>using namespace std;void print(int N,char from,char to,char hel原创 2020-08-04 20:02:29 · 201 阅读 · 0 评论 -
小白上楼梯C++(递归+动态规划)
递归#include<iostream>using namespace std;int count=0;int total;void f(int current){ if(current==total) count++; if(current>total) return; f(current+1); f(current+2); f(current+3);}int main(){ int t; cin>>total; f(0); c.原创 2020-08-04 11:20:44 · 766 阅读 · 0 评论 -
c++位运算相关题目
逻辑移位:移位所缺少的数字用“0”来填充算术移位:移位所缺少的数字用符号位来填充第一题、题解:如何找数组中唯一成对的那个数异或能消除重复的数,重复的数出现偶数次,将已知的数和数组中所有的数都取异或就得到为出现奇数次的数第二题、找出落单的数,这样编程就对了直接全部的数异或第三题、一题三解:计算二进制中1的个数1、数不变,与之异或的数移动2、数移动与1异或3、x&(x-1)每次消去一个1,直至x为0结束第四题、一条语句判断整数是不是2的整数次方x&(x-1)只进行一.原创 2020-07-31 11:02:57 · 735 阅读 · 0 评论 -
打家劫舍系列DP之打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。示例 2:输原创 2020-06-12 15:21:34 · 105 阅读 · 0 评论 -
打家劫舍系列DP之打家劫舍I
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,原创 2020-06-12 11:13:22 · 142 阅读 · 0 评论 -
经典DP问题之乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。构造两个辅助数组,一个存最大值,一个存最小值,最大值乘一个负数可能变成最小值,最小值乘一个负数可能变成最大值。#include<iostream>usi原创 2020-06-11 23:53:40 · 319 阅读 · 0 评论 -
经典DP问题之三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。题目链接#incl原创 2020-06-11 23:28:13 · 194 阅读 · 0 评论 -
经典DP问题之最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。#include<iostream>using namespace std;int arr[10000];int _max;int main(){ int n;原创 2020-06-11 23:20:46 · 162 阅读 · 1 评论 -
线性DP之最长上升子序列 (LIS)
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?题目链接1、动态规划复杂度O(n^2)#include<iostream>using namespace std;原创 2020-06-11 19:54:24 · 209 阅读 · 0 评论 -
算法基础之将字符串中按单词翻转18
题目:将字符串中按单词翻转,如:(I want to be a painter) 变为 (painter a be to want I)#include<iostream>#include<string.h>#include<algorithm>using namespace std;int main(){ char arr[100]; gets(arr); int start=0; for(int i=0;i<strlen(arr);i++)原创 2020-05-28 11:28:45 · 108 阅读 · 0 评论 -
算法基础之旋转词17
题目:如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。#include<iostream>using namespace std;int main(){ string str1,str2; cin>>str1>>str2; str1+=str1; if(str1.find(str2)!=string::npos) cout<<true; else cout<<false; ret原创 2020-05-28 11:08:22 · 154 阅读 · 0 评论 -
算法基础之判断两字符串的字符集是否相同16
题目:注意个数不同也算相同如:aacd和ddccaa,只要字符相同就行#include<iostream>using namespace std;int arr[256];int main(){ string str1,str2; cin>>str1>>str2; int flag=1; for(int i=0;i<str1.length();i++) { arr[str1[i]]=1; } for(int i=0;i<str2.l原创 2020-05-28 10:11:19 · 92 阅读 · 0 评论 -
算法基础之压缩字符串15
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。示例1:输入:“aabcccccaaa”输出:“a2b1c5a3”示例2:输入:“abbccd”输出:“a1b2c2d1”解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。提示:字符串长度在[0, 50000]范围内。#include&原创 2020-05-28 09:54:07 · 184 阅读 · 0 评论 -
算法基础之字符串中的空格替换14
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。字符串#include<iostream>using namespace std;int main(){ string str="%20",source="We Are Happy",result; for(int i=0;i<source.length();i++) { if(source[i]==' ')原创 2020-05-28 09:35:54 · 95 阅读 · 0 评论 -
算法基础之变形词问题13
题目:如果两个字符串中字符的种类相同并且每种字符出现的次数也相同,那么这两个字符串互为变形词。解法一,快排+比较#include<iostream>#include<algorithm>using namespace std;int main(){ string str1,str2; cin>>str1>>str2; sort(str1.begin(),str1.end()); sort(str2.begin(),str2.end());原创 2020-05-27 21:41:24 · 190 阅读 · 0 评论 -
算法基础之巧妙翻转字符串12
#include<iostream>#include<algorithm>using namespace std;int main(){ string str; cin>>str; reverse(str.begin(),str.end()); cout<<str; return 0;}原创 2020-05-27 21:32:47 · 115 阅读 · 0 评论 -
算法基础之判断字符串有无重复字符11
统计字符串中是否有重复元素并不难,但是巧妙地利用数组的下标来完成这一操作是必备的思想,因为数组的下标在很多地方都有巧妙地应用#include<iostream>using namespace std;int arr[128];int main(){ int flag=1; string str; cin>>str; for(int i=0;i<str.length();i++) { arr[str[i]]++; if(arr[str[i]]>1原创 2020-05-27 21:29:59 · 135 阅读 · 0 评论 -
算法基础之矩阵乘法10
矩阵运算是算计的基础,但是逻辑比较难记,往往措手不及1 2 3 1 21 2 3 X 1 21 2 3 1 2#include<iostream>using namespace std;int arr1[][3]={{1,2,3},{1,2,3},{1,2,3}};int arr2[][2]={{1,2},{1,2},{1,2}};int n1=3,n2=3,n3=2;int arr3[3][2];int main(){ for(int i=0;原创 2020-05-27 21:21:53 · 198 阅读 · 0 评论 -
算法基础之子矩阵最大累加和9
给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和例如,matrix为-1 -1 -1-1 2 2-1 -1 -1其中最大累加和的子矩阵为:2 2所以返回4原创 2020-05-27 21:01:41 · 130 阅读 · 0 评论 -
算法基础之编程返回组数组最大累加和8
给定一个数组arr,返回子数组的最大累加和例如:arr=[1,-2,3,5,-2,6,-1], 所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12.原创 2020-05-27 10:46:33 · 160 阅读 · 0 评论 -
算法基础之边界为1的最大子方阵7
题目:给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度,例如:{0, 1, 1, 1, 1}, {0, 1, 0, 0, 1}, {0, 1, 0, 0, 1}, {0, 1, 1, 1, 1}, {0, 1, 0, 1, 1} 其中,边框全是1的最大正方形的大小是4*4,返回4直接处理遍历每个节点,并以该节点为左上角对上下左右四条边分别遍历#include<iostream>using namespace std;in原创 2020-05-27 10:16:14 · 140 阅读 · 0 评论 -
算法基础之Z行打印二维数组6
打印例子如下,我们设置两个点分别是A、B。每次A往绿色箭头移动一步,B往蓝色箭头移动一步,所要打印的就是A、B连线之间的元素,但是要区分下方向(斜向上或者斜向下),打印结果为1 2 3 45 6 7 89 10 11 121,2,5, 9 ,6, 3, 4 ,7, 1 0, 11, 8, 12//用两个数组标记为0的行和列,遍历时如果为0就将当前的行和列设为1,当在此遍历时,如果当前的行下标或者列下标为1时直接设为0 #include<iostream>using namespac原创 2020-05-13 22:06:36 · 260 阅读 · 0 评论 -
算法基础之矩阵将0所在的行列清零5
编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行和列清零。//用两个数组标记为0的行和列,遍历时如果为0就将当前的行和列设为1,当在此遍历时,如果当前的行下标或者列下标为1时直接设为0 #include<iostream>using namespace std; int arr[100][100];int index1[100];int index2[100];int main(){ int n; cin>>n; int count=0; for(in原创 2020-05-13 21:15:28 · 391 阅读 · 0 评论 -
算法基础之顺序打印二维数组4
#include<iostream>using namespace std; int arr[100][100];int main(){ int n; cin>>n; int count=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { arr[i][j]=++count; cout<<arr[i][j]<<" "; } cout<<endl;原创 2020-05-13 21:03:51 · 354 阅读 · 1 评论 -
算法基础之自定义排序(特殊排序)3
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个例如:输入{3,5,1,0},则输出{0135}.#include<iostream>#include<algorithm>using namespace std; string str[100];int cmp(string str1,string str2){ return str1+str2<str2+str1; }void val(string str)原创 2020-05-12 20:13:24 · 185 阅读 · 0 评论 -
算法基础之需排序的子数组长度是多少2
给定一个无序数组arr,求出需要排序的最短子数组的长度,对子数组排序后能使得整个数组有序,即为需要排序的数组。例如:arr=[1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序。#include<iostream>using namespace std;int main(){ int n=7; int arr[]={1,5,3,4,2,6,7}; int p1=-1; int p2=-1; int max=arr[0]; int min=arr[n-1];原创 2020-05-12 19:42:29 · 203 阅读 · 0 评论 -
算法基础之排序数组中求和的因子1
题目:给定已排序数组,不重复打印arr中所有相加和为k的不降序二元组?扩展题:三元组呢?如输入arr = {-8,-4,-3,0,2,4,5,8,9,10},k=10,那么该输出(0,10) (2,8) 。#include<iostream>using namespace std;int main(){ int arr[]={-8,-4,-3,0,2,4,5,8,9,10},k=10; for(int i=0,j=9;i<j;) { if(arr[i]+arr[j]=原创 2020-05-12 18:14:21 · 175 阅读 · 0 评论