- 博客(45)
- 收藏
- 关注
原创 UVA 524(dfs)
题目描述思路深搜,并提前处理将1放进数组就好了。注意格式要求具体代码#include <iostream>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <algorithm>#include <cstdio>#include <cstdlib
2021-06-01 17:04:30 160
原创 UVA 11059
题目描述思路两重循环就可以了,但要注意吧答案定义为long long(因为 1 <= n <= 18, -10 <= Si <= 10。具体代码#include <iostream>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <algo
2021-05-25 16:14:05 153
原创 UVA 725
问题描述思路看到这一题我首先想到的是枚举0~9的全排列,此时枚举量是10!。但实际上只需枚举fghij就可以了,可以利用set的特性向set中不断的插入,最后判断就可以了。具体代码#include <iostream>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <alg
2021-05-25 15:28:28 183
原创 算法竞赛入门经典 排列
题目描述习题2-6 排列(permutation)用1,2,3…9,组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。思路全排列,在排列的过程中判断这个数是否合理具体代码#include <iostream>using namespace std;int path[10];bool st[10];int merge(int l, int r)
2021-05-17 20:39:34 278
原创 剑指 Offer 53 - I. 在排序数组中查找数字 I(二分)
题目描述统计一个数字在排序数组中出现的次数。思路二分的模板题找到大于等于target最小的数和小于等于target最大的数就可以了具体代码class Solution {public: int search(vector<int>& nums, int target) { if (nums.size() == 0) return 0; int l = 0, r = nums.size() - 1; while (l &
2021-05-16 01:01:04 68
原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。思路自定义cmp具体代码class Solution {public: static bool cmp (int a, int b) { return a % 2 > b % 2; } vector<in
2021-05-16 00:36:56 73
原创 leetcode 905. 按奇偶排序数组(三种方法)
题目描述给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。思路第一种方法:扫描数组两遍第二种方法:基于快排的思想第三种方法:自定义cmp排序具体代码方法一class Solution {public: vector<int> sortArray
2021-05-16 00:28:45 147
原创 剑指 Offer 57 - II. 和为s的连续正数序列 (滑动窗口)
题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。思路如果和小于target的话,右指针向右移动如果和大于target的话,左指针向右移动如果等于target的话,记录这组方法注意:这个滑动窗口是左闭右开的区间具体代码class Solution {public: vector<vector<int>> findContinuousSequen
2021-05-15 23:37:39 82
原创 leetcode 1636. 按照频率将数组升序排序
题目描述给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。请你返回排序后的数组。思路1.统计每个数出现的频率2.排序具体代码class Solution {public: vector<int> frequencySort(vector<int>& nums) { unordered_map<int, int> cnt; for
2021-05-15 22:29:55 125
原创 leetcode 1356.根据数字二进制下 1 的数目排序
题目描述给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。示例 1:输入:arr = [0,1,2,3,4,5,6,7,8]输出:[0,1,2,4,8,3,5,6,7]解释:[0] 是唯一一个有 0 个 1 的数。[1,2,4,8] 都有 1 个 1 。[3,5,6] 有 2 个 1 。[7] 有 3 个 1 。按照 1 的个数排序得到的结果数组为
2021-05-13 22:52:17 62
原创 偶数项斐波那契数列求和
题目描述斐波那契数列中的每个新项都是通过将前两个项相加而生成的。从1和2开始,前10个项将是:1,2,3,5,8,13,21,34,55,89,…通过考虑斐波那契数列中值不超过400万的项,找到偶值项的总和。思路可以直接通过公式来求,第三项等于前两项之和也可以通过推导公式来求,只求偶数项Fn=Fn−1+Fn−2=Fn−2+Fn−3+Fn−3+Fn−4=2Fn−3+Fn−2+Fn−4=2Fn−3+(Fn−3+Fn−4)+(Fn−5+Fn−6)=3Fn−3+Fn−4+Fn−5+Fn−6=4Fn−3
2021-05-13 11:30:19 2097 1
原创 LeetCode 46. Permutations(dfs)
问题描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路经典的dfs,直接爆搜就可以了AC代码class Solution {public: vector<int> path; vector<bool> st; vector<vector<int>> ans;
2020-12-25 23:49:37 74
原创 LeetCode 43. 字符串相乘(高精度 + 模拟)
问题描述给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比
2020-12-25 22:14:27 140
原创 LeetCode 40. 组合总和 II(dfs)
问题描述给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]示例 2:输入: cand
2020-12-24 22:05:13 78
原创 LeetCode 39. 组合总和(dfs)
问题描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target =
2020-12-24 11:44:25 81
原创 LeetCode 38. 外观数列(模拟)
问题描述给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = “1”countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下:111211211111221第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”
2020-12-24 10:34:30 124
原创 LeetCode 37. 解数独(dfs)
问题描述编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。提示:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。思路爆搜AC代码class Solution {public: bool ro
2020-12-22 16:41:10 96
原创 LeetCode 36. 有效的数独(模拟)
问题描述判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例 1:输入:[[“5”,“3”,".",".",“7”,".",".",".","."],[“6”,".",".",“1”,“9”,“5”,".",".","."],[
2020-12-22 15:23:11 104
原创 LeetCode 35. 搜索插入位置(二分)
问题描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0思路直接二分,注意一下数组中不存在target的情况就行了AC代码class Solution {public
2020-12-21 21:33:52 67
原创 LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
问题描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例 1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例 2:输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]示例 3:输入:nums =
2020-12-21 21:20:52 86
原创 LeetCode 33. 搜索旋转排序数组(二分)
问题描述升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。示例 1:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2:输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1示例 3:输入:nums = [1], targ
2020-12-19 18:54:11 130 1
原创 leetcode 31.下一个排列
问题描述实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [1]输出:[1]提示:1 <= num
2020-12-19 18:45:31 104 1
原创 银河英雄传说(并查集)
问题描述有一个划分为N列的星际战场,各列依次编号为1,2,…,N。有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列。有T条指令,每条指令格式为以下两种之一:1、M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。2、C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间隔了多少艘战舰。现在需要你编写一个程序,处理一系列的指令。输入格式第一行包含整数T,表示共有T条指令。接下来T行,每行一个指令,指令有两种
2020-11-15 21:54:49 409
原创 Codeforces 115A(并查集)
问题描述思路这一题可以用并查集来写,将整个图看作若干个树,找出树的深度的最大值AC代码#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue> typedef long long LL; #define IOS ios::sync_with_stdio(false)
2020-11-15 16:59:42 139
原创 leetcode20.有效的括号
问题描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true思路这一题可以用栈来做
2020-11-15 10:43:46 80
原创 leetcode19.删除链表的倒数第N个节点
问题描述给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。思路1.遍历链表求出链表的长度。2.遍历链表删除指定节点。3.注意删除头节点的情况AC代码/** * Definition for singly-linked list. * struct ListNode {
2020-11-15 09:33:24 76
原创 leetcode17.电话号码的字母组合
问题描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].思路深搜,直接搜就好,也没有什么好优化的AC代码class Solution {public: vector<string> res; string strs[10] = { ""
2020-11-14 17:29:53 120
原创 leetcode14.最长公共前缀
问题描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。思路遍历单词,依次比较就行了AC代码class Solution {public: string longestCommonPrefix(vector<string>& s
2020-11-14 17:15:32 91
原创 leetcode13.罗马数字转整数
问题描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
2020-11-14 17:02:13 67
原创 leetcode12.整数转罗马数字
问题描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
2020-11-10 15:42:31 67
原创 leetcode11.盛最多水的容器
问题描述给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:he
2020-11-10 15:14:34 116
原创 leetcode9.回文数
问题描述判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。思路如果是负数的话直接false,如果是正数的话把这个数反转一下看看是否相等。注意定义的结果数要用long lon
2020-11-09 22:40:16 103
原创 leetcode8.字符串转换整数
问题描述请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。注意:假如该字符串中的第一个非空格字符不是一个
2020-11-09 21:58:07 132
原创 leetcode7.整数反转
问题描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。思路从右向左扣出每一位数字,并且加起来就好了,时间复杂度为O(logn)。注意:用long long 存起来,可能会溢出。cla
2020-11-08 15:58:43 68
原创 leetcode6.z字形变换
问题描述Z 字形变换将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输
2020-11-08 15:20:53 89
原创 leetcode5.最长回文字串
问题描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路分析:这道题由于数据范围比较小所以可以用暴力直接做时间复杂度为O(N)。找到回文串的中心直接向两边扩展,直到遇到不同的字符或者某一边出了边界为止。由于回文串有两种情况,当回文串为基数时s[i - k] == s[i + k],为偶数时s[i - 1 - k
2020-11-08 10:31:14 186
原创 leetcode 3.无重复字符的最长子串
问题描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。思路
2020-11-04 17:38:00 64
原创 leetcode 2.两数相加(链表)
两数相加题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807AC代码/** * Definition f
2020-11-03 15:51:03 152
原创 leetcode 1.两数之和(哈希表)
leetcode 1.两数之和问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]AC代码1.哈希表class Solution {public: vector&l
2020-11-03 15:37:33 102
原创 逆序对数(归并排序)
逆序对数问题描述:给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000问题分析这个题可以用归并排序来写。每次把一个数组分成两个子数组,递归对两边的子数组进行排序,在递归处理排序时可以直接计
2020-11-02 22:50:58 2111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人