技巧
文章平均质量分 74
小胡同的诗
千里之行,始于足下
展开
-
LeetCode24两两交换链表中的节点(栈 | 递归 | 非递归)
题目链接:leetcode24题目大意给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.题目其实没有说清楚,两两交换的字眼容易误以为数据一定为偶数个,但根据测试结果来看有奇数的情况,多出来的那个不需要交换。也就是两个一组进行交换,最后无法构成两个的则不操作。解题思路栈由于是分别逆置一组中的两个元素,并且后面交换后原创 2020-08-22 01:21:01 · 209 阅读 · 0 评论 -
LeetCode3 无重复字符的最长子串(滑动窗口)
题目链接:leetcode3题目大意给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是原创 2020-08-18 23:36:55 · 113 阅读 · 0 评论 -
FZU2306远征(双指针)
题目链接:fzu2306解题思路:每个小的最好能依赖于比他大的而自己形成一队,而由于队列的关系,那个大的此时也依赖于下一个,于是最好的排列一定是一大一小交叉的,双指针可以有效地实现这个逻辑。Code:#include <cstdio>#include <algorithm>using namespace std;const int maxn = (int)...原创 2019-10-24 12:25:16 · 471 阅读 · 0 评论 -
关于某个日期快速计算是星期几(基姆拉尔森公式)
前言如果有这样的问题:如果y年m月d日是星期k,那么请问y1年m1月d1日是星期几?思路首先如果询问的日期都在1970年之后的话,我们可以使用Excel直接计算。Java的Calendar类,使用和Excel非常类似,略直接模拟,注意判断闰年,年份、月份、天数的变化处理基尔拉姆森公式:这个公式可以直接计算出那个日期是星期几,但请注意!这类问题如果假设和真实情况不符的时候要记得换上偏移...原创 2019-03-22 11:47:32 · 3560 阅读 · 0 评论 -
和为S的连续序列(双指针、滑动窗口)
链接:和为S的连续序列题目详情:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!分析:很容易...原创 2019-08-02 16:31:18 · 125 阅读 · 2 评论 -
线性时间找链表倒数第k个节点
题目描述09年统考的源题,虽然都能得到**O(n)**的复杂度,不过满分做法是双指针,也就是指针扫一遍,其余做法均10分。输入一个链表,输出该链表中倒数第k个结点。思路:比较直观的想法是辅助空间或者是借助栈、递归等方式实现,不过正解还是双指针,发现408很喜欢靠双指针的思想,用来优化线性复杂度。做法如下:指针1顺序扫到正数第k个节点,从这时候开始指针2跟着指针1往后扫,当指针1到达尾部时,...原创 2019-07-26 15:47:15 · 138 阅读 · 0 评论 -
滑动窗口问题(单调队列)
链接:滑动窗口题目详情:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[...原创 2019-08-01 11:04:03 · 465 阅读 · 0 评论 -
LeetCode-三数之和(双指针)
链接:https://leetcode-cn.com/problems/3sum题目详情:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:...原创 2019-07-27 17:50:26 · 244 阅读 · 0 评论 -
求坐标轴上点的最近K个点(双指针)
思路:预处理一下点的顺序,然后询问的时候从Tag左边右边分别找k个点,只后双指针扫一遍就能得到最近的k个序列#include <bits/stdc++.h>using namespace std;struct node{ #define MAXN 1005 int pos; int id; bool operator < (const n...原创 2019-08-27 22:11:26 · 287 阅读 · 0 评论 -
三个数组三数和问题思考(双指针)
题目:之前介绍过在一个数组上的三数和问题,根据排序后的单调性,我们可以利用双指针来寻找到三个数和为k的三元组,对于四元组实际上多一维进行枚举(四数和问题),这里还有个hash表的解法。那么,回归三数和问题,如果三个数分别处在三个数组中呢?所求的三元组要处于三个数组。思路:我们同样用双指针的思路:首先我们要对三个数组排序接着枚举A数组构造k=answer−A[s]k=answer-A[s]k...原创 2019-09-02 10:05:50 · 770 阅读 · 0 评论 -
LeetCode279完全平方数(动态规划+类似SPFA的队列优化)
题目链接:LeetCode279Ps:拉格朗日四平方和定理思路:根据分析,每个大的平方数会由许多小的平方数转移过来,于是可以写出这样一个转移方程:dp[i+j2]=min(dp[i]+1,dp[i+j2])dp[i+j^2]=min(dp[i]+1,dp[i+j^2])dp[i+j2]=min(dp[i]+1,dp[i+j2]),于是我们可以枚举n以内的所有状态转移到n以内的更大的平方数,最...原创 2019-09-02 11:27:53 · 145 阅读 · 0 评论 -
LeetCode32最长有效括号(DP+栈)
题目链接:Leetcode32思路:动态规划,复杂度O(n)O(n)O(n)注意状态要设计成以i位置为结尾的最长合法长度而不能只单单设计前i个字符的最长合法串,否则转移方程很难得到,状态转移时注意前不要越界,特别是第三个caseclass Solution {public: int longestValidParentheses(string s) { //...原创 2019-09-04 23:14:27 · 111 阅读 · 0 评论 -
LCS的优化算法
链接:LCS转LIS(nlogn算法)PS智商被压制啊,没太懂,打个标记。将第一个序列离散化成位置数组这开始没看懂,除了二分还可以用树状数组,qwq。50分代码是滚动数组优化的LCS。...原创 2019-03-15 17:21:32 · 994 阅读 · 0 评论 -
hihoCoder1483区间价值(离散化+二分答案+尺取法)
题目3 : 区间价值时间限制:10000ms单点时限:1000ms内存限制:256MB描述给定n个数A1...An,小Ho想了解AL..AR中有多少对元素值相同。小Ho把这个数目定义为区间[L,R]的价值,用v[L,R]表示。例如1 1 1 2 2这五个数所组成的区间的价值为4。现在小Ho想知道在所有的的v[L,R](1 <= L <= R <...转载 2019-02-16 12:27:40 · 231 阅读 · 1 评论 -
POJ3061Subsequence(二分法and尺取法)
题目大意:给你n个数字,一个终点数S,求这n个数字(顺序不能改变)中截取k个数字使之和大于或等于这个数S解题思路:1. 二分法:输入数字的时候对设置一个辅助数组进行预处理,即在i位置的时候使这个数组保存着从开头到目前这个区间所有数字的累和,目的是什么呢?当你知道一个区间的头和尾的时候你直接用尾部位置的数减去头部前一个位置的数得到的就是本区间的数字累和。然后就是寻找头部和尾部,用一个循环枚举头的情况...原创 2018-02-13 11:23:21 · 227 阅读 · 0 评论 -
蓝桥杯 分巧克力(二分答案)
代码如下:#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<set>#include<map>#include<string>#include<vector>#原创 2018-03-23 20:53:46 · 633 阅读 · 2 评论 -
旋转矩阵
大意:一种很基础的编码能力,打印由n*m矩阵旋转后的图解题思路:一共就几种方向,循环条件控制要打印的图的规模,然后通过下标引用控制原图如何输出。这种题在蓝桥视频中有提到,不过是旋转方阵,应该更简单,1号考试碰到要写得出来!代码如下:#include<bits/stdc++.h>using namespace std;int main(){ int n,m,t,cnt,len,...原创 2018-03-24 17:45:37 · 166 阅读 · 0 评论 -
牛客网 旋转矩阵(模拟)
AC代码如下:#include<bits/stdc++.h>using namespace std;int main(){ int n,m,t,cnt,len,i,j; char image[100][100],str[10000]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); g...原创 2018-03-24 17:56:51 · 275 阅读 · 0 评论 -
牛课网 强迫症的序列
解题思路:把一个序列中的n-1个项都+1,其实逆过来想就是被排除在外的那个数-1,如果按照题目的思路最终数列一定发展到全部都是大于等于最大那个数的某一个数;换言之,如果我们每次选一个-1,最终结果就是全部都是最小的那个数。这样问题就相对简单了。这样我们就可以统计这样操作的步数,但如果是顺着题目的意思做的话最终数组会都是哪个数字呢?我们发现,每次最小的那个数一定是参与这个+1的,我们既然逆过来能算出...原创 2018-03-24 22:52:48 · 180 阅读 · 0 评论 -
POJ2456(二分答案)
题意:给一段长度为N数字(不保证有序),将其分成M段,问这M段中,长度最小值最大为多少?(最大化最小值)思路:二分答案模板题目链接:POJ2456#include<iostream>#include<string>#include<algorithm>using namespace std;#define maxn (int)1e5+10#...原创 2018-05-29 22:20:08 · 761 阅读 · 0 评论 -
HDU2203(kmp+思维)
题目大意: 给两个串s1,s2。问s2能不能和s1循环移动n次(n&gt;=0)的串中匹配成功。解题思路: 硬模拟的话会超时,复杂度接近O(n^2)。由于循环移动之后的状态一定属于两个s1拼接后的其中一个字串。于是按此操作AC。复杂度O(2*n-1+m)。这题利用拼接的技巧似乎模式串匹配直接用strstr也能完成。效率也蛮高- -AC代码:kmp:#include &lt;stdio.h...原创 2019-01-03 23:17:47 · 247 阅读 · 0 评论 -
编程之美--只考加法的面试题(尺取法)
问题: 对于一个任意的自然数,问是否能将其拆分成2个或2个以上的连续自然数之和,写出所有的等式。解题思路: 第一种解法是推导出数学公式,因为连续的自然数可以用等差数列Sn求和公式,判断可行性。公式推导以及证明过程:数学解法;第二种解法是直接穷举解法,不过对于较大的数字复杂度O(n^2)可能不够解决,由于连续的自然数一定是递增状态,我们可以用尺取法,也就是双指针法将复杂度降低到O(n)双指针解...原创 2019-01-14 12:47:22 · 222 阅读 · 0 评论 -
最大连续子段和进阶--(循环数组)
交题地址:最大循环子段和题目大意:一段n长度的序列数,围成一圈,问从中取连续的一段子段最大值为多少解题思路:最大连续子段和,由于是循环的,思路1:在n长度的后面在添加一个n-1长度的相同子段,不过这个出来的值有误,比如一般的全正数这个答案不成立,要考虑子段和的长度不能超过n,由于我写的是在线的方法,不好处理,即使是改成移位然后处理的代码显然会TLE(O(n^2))放弃该思路。不过也能过80...原创 2019-01-31 18:57:13 · 621 阅读 · 0 评论 -
HDU2511(汉诺塔结论)
题目链接:汉诺塔X解题思路:单纯的模拟由于数据规模比较大,会爆栈或者超时。可以利用汉诺塔的移动次数的2^(n-1)+1的结论进行优化。AC代码:/*汉诺塔:移动k个盘需要2^(k-1)+1次数,其中1,3阶段镜像,故次数相同。1: 2^(k-1)+12: 13: 2^(k-1)+1*/#include <cstdio>#include <cstring&...原创 2019-01-22 23:54:24 · 335 阅读 · 0 评论 -
逆序数介绍以及算法实现
前言线性代数中对于一段数字序列的排列情况有这样一个定义:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素...原创 2019-02-15 16:07:06 · 4602 阅读 · 0 评论 -
c++输入输出流重定向
#includeusing namespace std;int main(){ freopen("e:\\input.txt","r",stdin); freopen("e:\\output.txt","w",stdout); int a,b; while(cin>>a>>b) cout return 0;}原创 2018-02-01 22:09:19 · 739 阅读 · 0 评论