数组
是
baixiaofei567
如果十年前没种树,那最好的时间是现在
展开
-
80. 删除有序数组中的重复项 II
两种方法法一:遍历然后erase,维护一个pre作为前一个数字,和前一个数字的出现次数,如果当前和pre相等,就让cishu++,不相等就更新pre和cishu。如果cishu大于2就erase当前迭代器,记得将it–,这个很重要,而且要让cishu也–。法二:快慢指针,这个快慢指针确实niubility,我是不太想得出,慢指针是放置完的所有数据的后一位,就是待放置的位置,快指针一直猛冲,就快指针和慢指针-2比,如果相等,就让快指针++,因为慢指针-2和慢指针-1,起码有两个数字是一样的了,那么快指针.原创 2021-04-07 01:17:55 · 188 阅读 · 0 评论 -
769. 最多能完成排序的块
维护一个值是最右端,比如43210,那么一开始的r就是4,就是从这里到下标为4的就是一整块,但是中间可能有超过4的,比如453210,那么在中间的过程中就会更新成5,那么一直到5才是一块class Solution {public: int maxChunksToSorted(vector<int>& arr) { //如果当前位置的数字不对,就一直往后找,找到应该放在这里的位置 //然后维护一个长度就是需要合成一块的数组 /.原创 2021-03-31 01:47:38 · 123 阅读 · 0 评论 -
565. 数组嵌套
暴力找环的题,重点是用一个unordered_set来记录当前数字是否被访问过了,如果没有就继续往后,如果被访问过了,就结束这条路径的查找,用当前路径长度来更新maxnunordered_set是全局的!!不是局部的,不是每次来一个新起点就维护一个unordered_set,全局的话就可以记录013这种路径,你到1就不会再次进入这次循环了,因为这是重复搜索了class Solution {public: int arrayNesting(vector<int>& nums.原创 2021-03-31 01:46:31 · 132 阅读 · 0 评论 -
766. 托普利茨矩阵
反正挺恶心一道题,你想要对它进行优化就会发现一些坑。老老实实只和自己右下角的比就行了,不要一条路走到黑,这样会有很多重复判断class Solution {public: bool isToeplitzMatrix(vector<vector<int>>& matrix) { //暴力遍历 int row = matrix.size(); int col = matrix[0].size(); ..原创 2021-03-31 01:40:50 · 87 阅读 · 0 评论 -
645. 错误的集合
法一:用哈希记录每个数字出现的次数,从1到n再次遍历,如果有出现次数为0的,这个数就是缺的,如果有等于2的,就是多。法二:(明天看)还是可以用抽屉法的,放回自己的原位,如果原位上已经放了自己的复制体就跳过,再次遍历,如果位置不符合,就直接返回这个数和这个位置class Solution {public: vector<int> findErrorNums(vector<int>& nums) { //用哈希记录每个数字的出现的次数 .原创 2021-03-30 01:32:13 · 117 阅读 · 0 评论 -
485. 最大连续 1 的个数
还是一样,最后更新一下maxn,因为可能最后以连续1结尾,那么就没碰到0,就不更新maxn了class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int maxn = 0; int tmp = 0; for(int i = 0; i < nums.size(); ++i){ if(nums[i] != 1){.原创 2021-03-29 01:20:58 · 90 阅读 · 0 评论 -
566. 重塑矩阵
class Solution {public: vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) { int row = nums.size(); int col = nums[0].size(); if(row*col != r * c) return nums; vecto..原创 2021-03-29 01:18:47 · 84 阅读 · 0 评论 -
130. 被围绕的区域
一开始还用一张图来存当前结点的O是否可以改,简直浪费内存。遍历四条边界,从边界的O进行dfs,将dfs能到达的O均改为一个特殊符号。最后遍历这张图,是特殊符号的改回O,不是特殊符号的O改成Xclass Solution {public: void dfs(vector<vector<char>>& board,int row, int col){ if(row < 0 || row >= board.size() || col <.原创 2021-02-08 01:28:35 · 106 阅读 · 1 评论 -
73. 矩阵置零
两个vector分别记录0元素的行和列,然后把这些行和列全部设为0class Solution {public: void setZeroes(vector<vector<int>>& matrix) { //把0元素的当前行和列全部置0 //先遍历一遍矩阵,记录下0元素的所有行列,遍历这些行和列置为0 vector<int> row; vector<int> col; .原创 2021-02-04 01:28:45 · 108 阅读 · 0 评论 -
62. 不同路径
dfs超时,所以用了dp,其实这种看到这种题目,看到和前一个格子(状态)有关系就应该想到dp。这里防止越界要判断是否是第一行或者第一列,第一行和第一列都只有一种走法,其余格子的走法是左边的所有走法+上边的所有走法class Solution {public: /*void dfs(int& m, int& n, int row,int col){ if(row == m-1 && col == n - 1){ res++..原创 2021-01-25 01:00:54 · 86 阅读 · 0 评论 -
54. 螺旋矩阵
超级棒的方法,自己想破脑袋也想不出。class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { //顺时针输出,搞清楚每一位的下一位是哪里 //一层一层来输出,每一层分上下左右 //最上面往右,最右边往下,最下边往左,最左边往上 //上边界 top : 0 //下边界 bo..原创 2021-02-04 01:16:16 · 103 阅读 · 0 评论 -
41. 缺失的第一个正数
让你找缺失什么的题目,必须想到放回原位!!这里放回原位的前一个,因为从0开始遍历,然后遍历数组,如果第0个放的不是1,那么少的第一个正数就是1.class Solution {public: int firstMissingPositive(vector<int>& nums) { //O(n)不能排序,O(1)不能hash,找到第一个缺失的正数>0 //又是让自己回到自己的位置上 //这个数太大或者太小放不回去不要紧的.原创 2021-02-03 01:11:35 · 48 阅读 · 0 评论 -
36. 有效的数独
一定是一个9*9的数独,为了一遍遍历完,我们定义三个hash表。也就是三个二维数组,行列和九宫格。row[i][j]存的是第i行的第j个数字是否存在,如果为0,证明在第i行第一次出现j,在遍历的时候就++。列也是如此。九宫格怎么定义每一块呢?(i/3)*3 + j/3就是当前格子所在的九宫格,也是九个九宫格。如果当前这个数所在的行或者列或者九宫格有这个数字了,也就是对应的位为1,那就直接返回falseclass Solution {public: bool isValidSudoku(..原创 2021-02-03 01:04:37 · 98 阅读 · 0 评论 -
56. 合并区间
对二维数组进行排序,依据第一位排序,如果返回0就交换位置。排序完后就很简单了,遍历该数组,如果当前区间的最小值小于结果数组最后一位的最大值,那么就得合并!!因为后一个区间的最小值大于等于前一个区间的最小值,那么如果小于前一个区间的最大值,就证明一定区间重复了。就更新结果数组最后一个区间的最大值,最小值不用更新!如果没有重复,就将当前区间加入结果数组,并将j++,j是我们用来记录结果数组最后一位的下标。class Solution {public: static bool cmp(vector&.原创 2021-01-22 02:32:08 · 139 阅读 · 0 评论 -
48. 旋转图像
找规律题,找到规律一开始后也只会用一个辅助数组存原来的值,因为当前值变换过去后会把替换后的值覆盖掉。其实你从第一个值一路换过去,也就是换4个值后又回到原点,所以我们就发现了每次最多4个点互换位置。我们层层推进,一共是n/2层,每一层要进行(n+1)/2的个四个点的互换。最内部就是用一个tmp记录第一个点,4代替1,3代替4,2代替3,1代替2。class Solution {public: void rotate(vector<vector<int>>& m..原创 2021-01-22 02:15:47 · 86 阅读 · 1 评论 -
剑指offer——机器人的运动范围C++
简单的dfs,搞清楚是从一个点出发,还是可以从所有点出发class Solution {public: //dfs且不用回溯,要回头走别的路,但是是递归的自动回头,走过的路不能再走 //最主要是判断这个格子是否能走 void dfs(int rows,int cols,int i, int j, bool vis[], int threshold,int& res){ int index = i*cols+j; if(i<0||i&.原创 2021-01-08 02:02:55 · 180 阅读 · 0 评论 -
剑指offer——数组中重复的数字C++
法1就是用map,如果map对应的值==1了就证明找到重复了。如果不为1,就对应的值++。法2:高级法,因为所有数字的范围是0到n-1,如果没有重复,那么每一位就在每一位的位置上,0就在0号位,1就在1号位。如果有重复,那么就会发生抢位的情况。遍历该数组,如果在自己的位置上,就continue。如果不在,就判断当前的值和它本来该放的位置的值是否相等,如果相等,那么就是找到重复的了,直接return true。如果不等,就把它放回该放的位置,用swap即可。#include<unordered_m.原创 2021-01-04 02:18:43 · 183 阅读 · 0 评论 -
剑指offer——数组中出现次数超过一半的数字C++
三种方法:1.排序后从前往后遍历,和下一个比较即可,如果相等cnt++,如果不相等,cnt重置为1.当cnt大于一半时,返回当前这个数。2.排序后返回中位数即可,也就是数组中间那个数。3.如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。第三种方法.原创 2020-12-28 00:04:03 · 233 阅读 · 0 评论 -
剑指offer——顺时针打印矩阵C++
矩形不一定是正方形,难点有三第一点是不知道外面的大循环要循环几次第二点是四次内循环怎么写第三点是后两次循环怎么控制不要重复打印1.大循环几次自己画图2.4次内循环分别是第i行,从第i列到col-i-1列第col-i列,从第i+1行到row-i-1行第row-i-1行,从col-i-1列到i列第i列,从row-i-1行到i+1行3.最后一圈有两种极端情况,只有1行或者只有1列。如果只有1行,那么第三次内循环会重复打印。如果只有1列,第四次内循环会重复打印。判断当前行是不是最后一行即可,当.原创 2020-12-26 02:15:48 · 153 阅读 · 0 评论 -
1005 Spell It Right (20分)
Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.Input Specification:Each input file contains one test case. Each case occupies one line which contains an N (≤10100原创 2020-10-10 00:11:10 · 51 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。class Solution {public: int maxSubArray(vector<int>& nums) { int res=nums[0]; for(int i=1;原创 2020-08-16 23:24:23 · 53 阅读 · 0 评论 -
238. 除自身以外数组的乘积
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不原创 2020-08-16 23:21:37 · 193 阅读 · 0 评论 -
219. 存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,1,2,3], k = 2输出: falseclass Solution {public: bool co原创 2020-08-16 23:10:02 · 50 阅读 · 0 评论 -
46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]class Solution {public: vector<vector<int>> res; vector<vector<int>> permute(vector<int>& nums) { v原创 2020-08-16 00:13:02 · 66 阅读 · 0 评论 -
78. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]class Solution {public: vector<vector<int>> res; vector<vector<int>> subsets(vector<in原创 2020-08-14 23:45:05 · 117 阅读 · 0 评论 -
1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]class Solution {public: vector<int> twoSum(vector<int>原创 2020-08-14 23:36:12 · 125 阅读 · 0 评论 -
442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]class Solution {public: vector<int> findDuplicates(vector<int>& nums) { vector<int>原创 2020-08-13 22:15:58 · 188 阅读 · 0 评论 -
287. 寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。class Solution {public: i原创 2020-08-13 21:56:38 · 130 阅读 · 0 评论 -
169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int,int>原创 2020-08-13 21:40:39 · 66 阅读 · 0 评论 -
119. 杨辉三角 II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]class Solution {public: vector<int> getRow(int rowIndex) { vector<vector<int>> vv(rowIndex+1); for(int i=0;i<=rowIndex;i++){原创 2020-08-13 00:09:05 · 61 阅读 · 0 评论 -
80. 删除排序数组中的重复项 II
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,1,2,3,3],函数应返回新长度 length =原创 2020-08-13 00:07:54 · 68 阅读 · 0 评论 -
26. 删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的原创 2020-08-13 00:00:06 · 70 阅读 · 0 评论 -
162. 寻找峰值
峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入: nums = [1,2,1,3,5,6,4]输出: 1 或 5解释: 你的函数可以返回索引 1,原创 2020-08-11 22:50:14 · 86 阅读 · 0 评论 -
73. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。示例 1:输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输入:[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]class Solution {public: void setZeroes原创 2020-08-11 22:43:43 · 69 阅读 · 0 评论 -
64. 最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。class Solution {public: int minPathSum(vector<vector<int>>& grid) { if(grid.size()==0原创 2020-08-11 22:39:51 · 79 阅读 · 0 评论 -
54. 螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出: [1,2,3,4,8,12,11,10,9,5,6,7]class Solution {public: vector<原创 2020-08-10 23:29:42 · 136 阅读 · 0 评论 -
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。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49class Solu原创 2020-08-10 22:45:01 · 118 阅读 · 0 评论 -
1122. 数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。示例:输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]class Solution {public: v原创 2020-08-10 22:37:13 · 100 阅读 · 0 评论 -
974. 和可被 K 整除的子数组
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。示例:输入:A = [4,5,0,-2,-3,1], K = 5输出:7解释:有 7 个子数组满足其元素之和可被 K = 5 整除:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]class Solution {public: int subarraysDivByK(vector<int>原创 2020-08-10 00:03:38 · 75 阅读 · 0 评论 -
560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。class Solution {public: int subarraySum(vector<int>& nums, int k) { int sum = 0, res = 0; // 注意这里前缀和多了一个0,防止漏掉数组的前缀和刚好等于原创 2020-08-09 22:20:01 · 85 阅读 · 0 评论