编程练习
softwareX4
我只是想要亿个offer罢了
展开
-
表达式求值(堆栈经典应用)
#include <iostream>#include <cstring>#include <cstdio>#include<queue>#include<string>#include<stack>using namespace std;int pri[5][5] = { 1,0,0,0,0, ...原创 2019-08-30 10:52:05 · 202 阅读 · 0 评论 -
Leetcode(55)跳跃游戏——贪心
题目描述给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但...原创 2019-06-16 16:03:54 · 196 阅读 · 0 评论 -
Leetcode(53)最大子序和——动态规划
题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。思路听题目就和最长上升子序列很像。用动态规划。怎么保证子序的...原创 2019-06-16 15:57:09 · 147 阅读 · 0 评论 -
Leetcode(49)字母异位词分组——Map应用
题目描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。思路字母相同排列不同——>ke...原创 2019-06-16 15:50:24 · 134 阅读 · 0 评论 -
Leetcode(48)旋转图像——矩阵变换
题目描述给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 ma...原创 2019-06-16 15:26:04 · 813 阅读 · 0 评论 -
Leetcode(46)全排列——回溯法的板子
题目描述给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]标准板子mark是用来标记对应位置元素有没有被使用过的,至于用map…纯粹是vector传参会出错,不明原因,有知道的大佬求告知~class Solution {public:...原创 2019-06-09 21:38:39 · 318 阅读 · 0 评论 -
Leetcode(34)在排序数组中查找元素的第一个和最后一个位置——二分法
题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10],...原创 2019-06-09 15:19:59 · 134 阅读 · 0 评论 -
Leetcode(33)搜索旋转排序数组——二分法
题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2],...原创 2019-06-09 15:04:09 · 187 阅读 · 0 评论 -
Leetcode(32)最长有效括号-——传统栈解法&左右计数器
题目描述给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路1看到括号匹配类题首先想到使用栈,跟栈的经典用法(表达式计算)类似,把左括号的下标入栈。为了计算长度,首先放入-1,遇到左括...原创 2019-06-09 14:39:31 · 384 阅读 · 0 评论 -
Leetcode(23)合并K个排序链表——k个元素的排序
题目描述合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出:1->1->2->3->4->4->5->6思路考虑Leetcode(21)合并两个有序链表那道题,使用k个指针分别指向k个链表的思路当然是可以的,但是k个元素...原创 2019-06-09 14:19:16 · 159 阅读 · 0 评论 -
Leetcode(31)下一个排列
题目描述实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1思路按照字典序,找到下一个更大的序列。 如果...原创 2019-06-08 11:55:14 · 131 阅读 · 0 评论 -
Leetcode(19) 删除链表的倒数第N个节点——快慢指针
题目描述给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路比较常规。方法一:两次遍历,第一次记链表长度,第二次删除从列表开头数...原创 2019-06-07 09:23:23 · 178 阅读 · 0 评论 -
Leetcode(15)三数之和——双指针碰撞
题目描述给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]思路这道题不算太难...原创 2019-06-06 10:56:23 · 208 阅读 · 0 评论 -
Leetcode(11)盛最多水的容器——双指针&&为什么不会错过最优解
题目描述给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入: [1,8,6,2,5,4,8,3,7]输出: 49思路一开始本着动...原创 2019-06-06 10:09:06 · 349 阅读 · 0 评论 -
Leetcode(10)正则表达式匹配(递归 and动规)
题目描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。‘.’ 匹配任意单个字符'’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = “aa”p ...原创 2019-06-04 00:28:38 · 2062 阅读 · 3 评论 -
leetcode(17)——电话号码的字母组合
题目描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。思路排列问题->用回溯...原创 2019-05-30 20:44:22 · 211 阅读 · 0 评论 -
leetcode(22)括号生成——官方解法三(闭合数)
题目描述给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]解题思路设所求序列为S[n],记其序号为n,则S[n]可以来自于之前求出的序列的组合再加上左右括号。比如 n = 3 时,我们要求3对括号能组成的有效...原创 2019-05-30 20:22:24 · 1640 阅读 · 0 评论 -
Manacher‘s Algorithm 马拉车算法——查找一个字符串的最长回文子串的线性方法
Manacher’s Algorithm 马拉车算法这个博主写的非常清楚了给定字符串 **s **,将处理后的字符串放入数组 ** t **.处理前:ababa 处理后:@#a#b#a#b#a#始终注意各个元素的含义,**数组 P[i] ** 用来存储以字符 **t[i] **为中心的回文子串的半径,若p[i] = 1,则该回文子串就是t[i]本身。辅助变量mx和id,其中i...原创 2019-05-29 12:40:58 · 185 阅读 · 0 评论 -
Leetcode(56)合并区间
题目描述给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。思...原创 2019-06-16 16:22:44 · 130 阅读 · 0 评论 -
Leetcode(62)不同路径——动态规划
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左上...原创 2019-06-16 16:29:03 · 160 阅读 · 0 评论 -
Leetcode(72)编辑距离——动态规划
题目描述给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = “horse”, word2 = “ros”输出: 3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> ro...原创 2019-06-28 09:17:32 · 134 阅读 · 0 评论 -
字符串匹配KMP算法之【next数组】
原理请看:KMP算法原理初次接触KMP,总结一下。如有错误请各位dalao指正QwQnextnextnext数组是什么?KMP算法主要有一个nextnextnext数组,这个数组记录着子串的前缀和后缀的【最大匹配长度】,初始化为-1.next[i]next[i]next[i]就记录前面长度为iii的子串前后缀匹配度。(非修正)比如,给定模式串abcababcababcab:比如在计算...原创 2019-08-20 12:04:24 · 456 阅读 · 0 评论 -
并查集
并查集这种数据结构用来表示集合信息,实现如确定某个集合含有哪些元素、判断某两个元素是否存在同一个集合中、求集合中元素的数量等问题。也就是用一个树来表示集合关系。图片内容摘自《王道》。并查集一般有几个基本操作:寻找结点的根,在过程中进行路径压缩合并两个集合判断是不是同一集合我们一般用一个数组表示下标对应结点及其根节点的关系。const int maxn = 5000;in...原创 2019-08-18 12:01:55 · 156 阅读 · 0 评论 -
KMP模板
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include<string>#include<vector>#define N 1000010using namespace std;int next[N];...原创 2019-08-30 10:52:59 · 135 阅读 · 0 评论 -
简单线段树模板
#include <stdio.h>#include <iostream>#include <string.h>#include<vector>#include<queue>using namespace std;const int maxn = 5000;int arr[6] = {2,6,8,9,5,3};int si...原创 2019-08-17 12:12:43 · 124 阅读 · 0 评论 -
二部图和匈牙利算法
二部图二部图的定义:设GGG是一个图,若V(G)V(G)V(G)有一个划分:V(G)=V1⋃V2V(G)=V_1 \bigcup V_2V(G)=V1⋃V2,使得<V1V_1V1><V2V_2V2>都是空图,那么称图GGG是一个双图,或二部图,或二分图。简单来说,就是在图中切上一刀,就能使所有点变成孤立的,如下图沿着红线切一刀。判定二分图一般使用标号法,即将一...原创 2019-08-11 11:01:51 · 454 阅读 · 0 评论 -
最小树形图(有向图的最小生成树)
我们知道,无向图的最小生成树的求法有Krusal和prime算法,一个是归点一个是归边,在具体实现上Krusal可以用并查集实现,难度不大。这里稍微区别一下最短路径和最小生成树(因为我又搞混了23333)最小生成树能够保证首先是树(对于n个顶点的图只有n-1条边),其次保证任意两个顶点之间都可达,再次保证这棵树的边权值之和为最小,但不能保证任意两点之间是最短路径;最短路径保证从源点S到目地...原创 2019-08-09 12:45:56 · 17175 阅读 · 1 评论 -
Tarjan算法、缩点染色及最小权点基
看了许多博客,还是这个最清楚:强连通算法–Tarjan个人理解+详解墙裂安利大家看看上面的博客!讲的非常清楚!(但是文章的代码好像有一点点小错误。Tarjan算法主要解决了有向图中有几个强连通分量的问题,基于Tarjan算法,可以对在同一连通分量的点染色,进而缩点,生成有向无环图。例:给定有向图,求:至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点至少要加多少条边,才能使得从...原创 2019-08-07 22:10:37 · 265 阅读 · 0 评论 -
博弈初入门小结
前几天看了一小些博弈的题目,至今已经差不多快搞混了2333 ,这里稍微总结一下以区别和加强记忆,均以取石子游戏为例。这些博弈均有一个性质:二人有限游戏双方皆拥有完全的资讯运气因素并不牵涉在游戏中–>那先行或后行者当一必有一方有必胜/必不败的策略。这条定理是策梅洛定理博弈规则必胜点referSG函数取的数量在一个规定的集合中,可多堆SG函数不为0,...原创 2019-08-07 11:46:01 · 135 阅读 · 0 评论 -
巴什博弈
题目描述简易版本两个顶尖聪明的人在玩游戏,有n个石子,每人可以随便拿1~m个石子,不能拿的人为败者,问谁会胜利如果n∈[1,m],先手必胜n == m+1,先手必败。推广可知 n==k(m+1)时先手必败n == k(m+1)+r,先手必胜。先手拿去r个,后手拿去x个,先手之后拿去 m+1-x个即可将局势转变为第二种情况,取胜。简而言之就是面临 n % (m+1) == 0的人必...原创 2019-08-06 11:20:05 · 175 阅读 · 0 评论 -
威佐夫博弈
入门题:POJ1067威佐夫详解例如,两堆石子,两种取法,要么在一堆中取任意数量,要么在两堆中取同等数量,取完者胜。根据前人研究,先手的必败局为(m,n)【其中 min(m,n) == | m - n | *1.618】在当前局势必胜的情况下,可以通过枚举差值使其满足必败局的条件,得到下一步的取法。#include <iostream>#include<cstdio&...原创 2019-08-05 21:24:53 · 167 阅读 · 0 评论 -
尼姆博弈
题目描述有若干堆石子,每堆石子的数量是有限的,二个人依次从这些石子堆中拿取任意的石子,至少一个(不能不取),最后一个拿光石子的人胜利。POJ2975POJ2234尼姆博弈讲解(四种类型变体)//poj 2975 第四种类型,先手的人想赢,第一步有多少种选择。//求出所有堆异或后的值sum,再用这个值去对每一个堆进行异或//令res = x1(+)sum(sum为所有堆的异或和)。...原创 2019-08-05 18:45:08 · 216 阅读 · 0 评论 -
SG函数
博弈问题问题需要满足四个性质:题目描述一般为A ,B 2人做游戏A B交替进行某种游戏规定的操作,每操作一次,选手可以在有限的操作(操作必须合法)集合中任选一种。对于游戏的任何一种可能的局面,合法的操作集合只取决于这个局面本身,不取决于其它因素(跟选手,以前的所有操作无关)如果当前选手无法进行合法的操作,则为负EG.这是一个二人游戏,一共有3堆石子,数量分别是m, n, p个...原创 2019-08-05 17:26:02 · 140 阅读 · 0 评论 -
leetcode(96)不同的二叉搜索树——卡塔兰数
题目描述给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 ...原创 2019-07-15 18:20:57 · 416 阅读 · 0 评论 -
leetcode(94) 二叉树的中序遍历——莫里斯遍历(非传统递归方法)
题目描述给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,3,2]思路二叉树的遍历用递归方法解十分简单。但是计算机是非常不愿意做递归运算的,因为有时候他占用空间是非常恐怖的,数字大了之后会非正常退出。这里提一下先序遍历的非递归解法:使用栈a. 遇到一个节点,访问它,然后把它压栈,并去遍历它的左子树;b. 当左子树遍历结束后...原创 2019-07-15 17:15:06 · 2401 阅读 · 2 评论 -
leetcode(84)柱状图中最大的矩形——栈
题目描述给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10思路来自leetcode@pow...原创 2019-07-14 09:51:59 · 213 阅读 · 0 评论 -
leetcode(76)最小覆盖子串——滑动窗口
题目描述给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。思路字符串处理一般思想就是滑动窗口,即双指针来更新窗口大小。在滑动窗口类...原创 2019-07-03 10:09:41 · 336 阅读 · 0 评论 -
leetcode(148)排序链表——链表的归并
题目描述在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5思路看到复杂度是O(n log n) ,首先想到归并排序和快...原创 2019-07-02 11:47:53 · 141 阅读 · 0 评论 -
Leetcode(3)字符串处理思想_滑动窗口
题目描述给定一个字符串,找出其中不含有重复字符的 最长子串 的长度。理解的关键在于子串必须是连续的,对于字符串来说,常用思想为滑动窗口...原创 2019-05-28 10:44:29 · 301 阅读 · 0 评论