算法
记录一些刷题的题解思路
烟雨边
不在能知,乃在能行
展开
-
算法模板——常用的数论算法
目录欧几里得算法快速幂算法欧几里得算法求两个整数的最大公约数,时间复杂度O(logn)int gcd(int a, int b) { return b ? gcd(b, a % b) : a;}快速幂算法快速求a的b次方typedef long long ll;ll quick_pow(const ll a, const ll b) { ll result = 1, ans = a; while (b) { // 如果b是奇数,结果乘一次底数 if (b &原创 2020-12-10 10:14:26 · 255 阅读 · 0 评论 -
算法模板——计算两日期相差的天数
日期算法计算两个日期相差的天数,如果日期年份比1971年小,需要修改1971为更小的值class Solution {public: int daysBetweenDates(string date1, string date2) { return abs(get(date1) - get(date2)); } bool leap(int year) { return (year % 100 != 0 && year % 4 =原创 2020-12-10 09:59:56 · 418 阅读 · 0 评论 -
算法模板——全排列算法
递归实现定义一个递归函数permutation(string str, int start, int end),该函数的功能是生成下一个全排列数组。每次递归确定好前缀元素,然后对后面剩余的元素排列,递归此过程。/** * str是输入的数组 * start和end代表剩余待排列数组的起始和终点 */int cnt = 0;void permutation(string str, int start, int end) { if (start == end) { // 4.当start到原创 2020-12-10 09:54:32 · 257 阅读 · 0 评论 -
算法模板——背包问题(动态规划)
1.01背包(物品只能拿或者不拿)#include <iostream>using namespace std;const int N = 1e5 + 10;int n, V;int w[N], v[N];int dp[N];int main(){ cin >> n >> V; for (int i = 0; i < n; i++) { cin >> v[i] >> w[i]; }原创 2020-12-10 09:52:56 · 181 阅读 · 0 评论 -
Leetcode 寻找数组的中心索引(利用前缀和、后缀和)
题目给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。示例 1:输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:索引 3 (nums[3] = 6) 的左侧数之和 (1 + 7 + 3 = 11),与右侧数之和 (5 + 6 = 11) 相原创 2020-07-21 14:18:52 · 602 阅读 · 0 评论 -
Leetcode 钥匙和房间(深搜)
题目有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 t原创 2020-07-21 13:50:50 · 628 阅读 · 0 评论 -
Leetcode 01矩阵 逆向思维
题目Leetcode 01矩阵打卡打卡打卡~题目Leetcode 01矩阵给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0示例 2:输入:0 0 00 1 01 1 1输出:0 0 00 1 01 2 1注意:给定矩阵的元素个数不超过 10000。给定矩阵中至少有一个元素是 0。矩阵中的元素只在四个方向上相邻:原创 2020-07-21 12:03:31 · 656 阅读 · 0 评论 -
Leetcode 字符串解码(深搜)
题意给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。思路使用递归,像k[]这种模式的字符串是可以嵌套的,如k[x k[xx] ]。那么就可以 看原创 2020-07-20 13:26:47 · 582 阅读 · 0 评论 -
栈和队列的互相实现
栈实现队列1. 思路栈是一种存放元素有后进先出特性的数据结构。利用栈后进先出的特性,那么用两个栈,就可以把出栈的元素顺序变成我们入栈的元素顺序。这样就可以用两个栈来翻转模拟队列先进先出。但是还有一个问题,这例子是一次性全部入栈,一次性全部出栈。如果是入栈-出栈-入栈这种操作要怎么处理。前面已经知道了可以把一个栈的数据放到另一个栈中翻转来模拟队列的先进先出。出栈的那个栈肯定是不能放我们刚入队的数据的,这样会破坏元素的顺序。所有我们要一个栈用于模拟入队操作,另一个栈模拟出队操作。出队的栈一但空了,就去原创 2020-07-20 11:40:36 · 614 阅读 · 0 评论 -
常用的排序算法模板
快速排序思想:基于二分思想,划分一个主元。把整个数组通过主元划分成两部分,小于主元的在左边,大于的在右边。对左右部分递归划分即可完成排序时间复杂度:时间复杂度在最佳情况是O(nlogn)O(nlog_n)O(nlogn),但是如果分界点元素选择不当可能会退化到O(n2)O(n^2)O(n2),但是这种情况比较少见(比如数组完全逆序),如果随机选择分界点的话,时间复杂度能够稳定在O(nlogn)O(nlog_n)O(nlogn)。另外如果元素中相同元素数量比较多的话,也会降低排序性能。空间复杂度在原创 2020-07-08 12:52:28 · 794 阅读 · 0 评论 -
2019年华南理工大学程序设计竞赛(春季赛)题解
题目在牛客上有https://ac.nowcoder.com/acm/contest/625#questionC 六数学家的困惑题意:就是给你两串数字,每次只能从其中一串数字的左侧或右侧取出一个数字,然后组成一串最大的字典序最大的串。做法是把两串数字翻转一下,变成四串数字,每次从字典序最大的那串数取数。#include <iostream>#include <...原创 2019-04-15 22:08:11 · 1059 阅读 · 0 评论 -
HDU 1176(动态规划)
附上题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176免费馅饼Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 67397 Accepted Submission(s): 2...原创 2019-01-12 17:53:51 · 743 阅读 · 0 评论 -
51nod_1000
入门a+b题#include<iostream>using namespace std;int main(){ long long a, b; while(cin >> a >> b){ cout << a+b << endl; } return 0;} ...原创 2019-01-04 13:53:26 · 716 阅读 · 0 评论