
数组与矩阵
cx_cs
这个作者很懒,什么都没留下…
展开
-
80. 删除有序数组中的重复项 II
无原创 2023-03-08 11:19:06 · 81 阅读 · 0 评论 -
74. 搜索二维矩阵
无原创 2023-03-08 10:49:25 · 78 阅读 · 0 评论 -
59. 螺旋矩阵 II
无原创 2023-03-08 10:06:17 · 78 阅读 · 0 评论 -
57. 插入区间
无原创 2023-03-07 11:46:44 · 100 阅读 · 0 评论 -
6. Z 字形变换
无原创 2022-08-18 11:56:00 · 73 阅读 · 0 评论 -
384. 打乱数组
要求:洗牌随机思路:在[i,n-1]的随机选一个与i交换class Solution {public: vector<int> origin; vector<int> current; int n; Solution(vector<int>& nums) { origin = nums; current = nums; n = nums.size(); }原创 2022-04-18 13:19:50 · 91 阅读 · 0 评论 -
341. 扁平化嵌套列表迭代器
要求:把一个无限嵌套的列表拆开成数组思路:递归,貌似可以把递归改成内部函数。另一方法是用栈,先倒序放进去,要取下一个才出栈,是列表再入栈/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * class NestedInteger { * public: *原创 2022-04-18 11:56:27 · 96 阅读 · 0 评论 -
289. 生命游戏
要求:细胞矩阵按规则更新https://leetcode-cn.com/problems/game-of-life/思路:法一:用额外矩阵class Solution {public: void gameOfLife(vector<vector<int>>& board) { int neighbors[3] = {0, 1, -1}; int rows = board.size(); int cols = bo原创 2022-04-16 19:39:49 · 2652 阅读 · 0 评论 -
73. 矩阵置零
要求:把有0元素所在行列置0思路:置0时会干扰后面操作,所以要新开空间记录0的位置,新开O(mn)当然可以。优化一:一行置0本质是判断该行是否存在0,所以开一个O(m)存每行是否存在0,列同理class Solution {public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size();原创 2022-04-04 23:00:05 · 646 阅读 · 0 评论 -
66. 加一
要求:数组组成一个数,加一思路:太简单了class Solution {public: vector<int> plusOne(vector<int>& digits) { int n=digits.size(); for(int i=n-1;i>=0;--i){ if(digits[i]!=9){ ++digits[i]; break;原创 2022-04-04 22:23:41 · 224 阅读 · 0 评论 -
41. 缺失的第一个正数
要求:找到数组里面第一个缺失的正整数(从1开始),要求时间O(n),空间O(1)思路:只能利用原数组的空间。长度为n的数组,答案必然在[1,n+1],原创 2022-04-04 19:19:14 · 170 阅读 · 0 评论 -
36. 有效的数独
要求:数独是否有效思路:一次遍历,row[i][j]表示第i行填了j,列同理,九宫格有三行三列,所以sub[3][3][9]表示每个九宫格出现的9个数class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { int rows[9][9]; int columns[9][9]; int subboxes[3][3][9];原创 2022-03-28 13:32:15 · 102 阅读 · 0 评论 -
581. 最短无序连续子数组
要求:给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度思路:看起来莫名其妙,实际上意思是最大最小值排好就是对的,可以排序后对比左右两边第一次出现不一样的范围,O(nlogn),可以优化到O(n)...原创 2022-03-24 13:06:47 · 105 阅读 · 0 评论 -
560. 和为 K 的子数组
要求:个数思路:前缀和,我们考虑以 i 结尾的和为 k 的连续子数组个数时只要统计有多少个前缀和为 pre[i]−k 的 pre[j] 即可class Solution {public: int subarraySum(vector<int>& nums, int k) { int s=0, cnt=0; unordered_map<int, int> mp; // 记录前缀和出现次数 mp[0] = 1; //原创 2022-03-23 22:44:18 · 115 阅读 · 0 评论 -
448. 找到所有数组中消失的数字
要求:n数组,数范围1-n,丢失的数可能多个思路:num范围1-n,可以映射到0-n-1,这个是下标,把对应下标i的数加n,则数大于等于n+1表示其下标曾经出现过,下标加1映射回numclass Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { int n=nums.size(); vector<int> res;原创 2022-03-23 22:28:34 · 216 阅读 · 0 评论 -
56. 合并区间
要求:rt思路:class Solution {public: bool static cmp(vector<int> &a,vector<int> &b){ return a[0]==b[0]?a[1]<b[1]:a[0]<b[0]; } vector<vector<int>> merge(vector<vector<int>>& intervals)原创 2022-03-19 13:10:33 · 106 阅读 · 0 评论 -
48. 旋转图像
要求:rt思路:法一:模拟class Solution {public: void rotate(vector<vector<int>>& matrix) { int n=matrix.size(); for(int start=0;start<n/2;++start){ for(int i=start;i<n-start-1;++i){ int ii=n-i-原创 2022-03-19 11:35:29 · 113 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
要求:B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路:class Solution {public: vector<int> constructArr(vector<int>& a) { int n=a.size(); vector<int> left(n,1); int tmp=1; for(int i=1;i<n;++i){原创 2022-03-12 12:22:26 · 88 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
要求:不能用条件判断循环乘除思路:&&class Solution {public: int sumNums(int n) { n&&(n+=sumNums(n-1)); return n; }};原创 2022-03-12 10:32:46 · 66 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
要求:连续5张,0可以当任意思路:class Solution {public: bool isStraight(vector<int>& nums) { vector<int> v(14,0); int minn=14,maxn=-1; for(int num:nums){ if(num==0)continue; if(v[num]>0)return fals原创 2022-03-11 21:15:27 · 126 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
要求:rt思路:注意剩下一行或者一列class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.size()==0)return {}; int m=matrix.size(),n=matrix[0].size(); vector<int> v(m*n); i原创 2022-03-04 20:27:42 · 61 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
要求思路class Solution {public: int get(int num){ int sum=0; while(num){ sum+=num%10; num/=10; } return sum; } int movingCount(int m, int n, int k) { vector<vector<bool>>原创 2022-03-02 20:40:12 · 64 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
要求:思路:直接循环求,优化为logn关键是快速幂,快速幂的意思是a^9,9可拆为1001,正常要乘8次但是可以通过除以2,计算a的2三次方*a的2零次方。也就是说,n&1为真时ans乘上a,其他时间在滚大a,从一次二次四次…换成矩阵法一:O(n)class Solution {public: int fib(int n) { int fn_2=0,fn_1=1,fn; while(n--){ fn=fn_1%10000000原创 2022-03-01 12:34:45 · 84 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
要求:找一个重复的数字,范围0-n-1思路:我们要使nums[i]=i。设nums[i]=m,而nums[m]=k,如果nums[i]=m=i则下一个,如果nums[i]=m≠i,则如果nums[m]=k=m则m是重复数否则交换nums[i]=k,nums[m]=m,即让m位置对。class Solution {public: int findRepeatNumber(vector<int>& nums) { int i=0,n=nums.size();原创 2022-02-28 16:55:54 · 68 阅读 · 0 评论 -
769. 最多能完成排序的块
要求:数组分块排序拼起来有序,注意拼时不改变块的位置,问最多几块思路:首先逆序不能拆,顺序可以拆,其次,如果一个块里的数的范围必须和下标范围一样,[3,4,2,1,0]只能是一块,当数的最大达到i时cnt++class Solution {public: int maxChunksToSorted(vector<int>& arr) { int cnt=0,maxnum=-1; for(int i=0;i<arr.size();++i)原创 2022-01-21 19:45:28 · 94 阅读 · 0 评论 -
565. 数组嵌套
要求:数组a,a[a[i]]一直连着最多多少个思路:class Solution {public: int arrayNesting(vector<int>& nums) { int n=nums.size(); int maxcnt=1; for(int i=0;i<n;++i){ int cnt=0; int j=i; while(nums[j]原创 2022-01-21 19:05:42 · 175 阅读 · 0 评论 -
766. 托普利茨矩阵
要求:判断左上右下对角线元素相等思路:差点一条条对角线来了class Solution {public: bool isToeplitzMatrix(vector<vector<int>>& matrix) { int m=matrix.size(),n=matrix[0].size(); for(int i=1;i<m;++i){ for(int j=1;j<n;++j){原创 2022-01-21 18:00:33 · 193 阅读 · 0 评论 -
697. 数组的度
要求:给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度思路:用一个map<int,vector>,O(n)class Solution {public: int findShortestSubArray(vector<int>& nums) { unordered_map<int,vector<原创 2022-01-21 17:48:25 · 67 阅读 · 0 评论 -
667. 优美的排列 II
要求:给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数。思路:1,k+1,2,k,3,k-1,…差k,k-1,…,1奇数位1,2,3…偶数位k+1,k…构造这些差只用了1到k+1,后面补上即可原创 2022-01-21 17:28:48 · 250 阅读 · 0 评论 -
287. 寻找重复数
要求:1到n,有一个重复,进阶O(n)思路:法一:环形链表,下标0~n,数范围为1~a,a,a+1~n映射0-1…k-ak+1-ak+2-a+1…n-n链接0->next=nums[0]=1,1->next=nums[1]=nums[nums[0]]=2这样把下标和元素都连起来,那么nums[k]=nums[k+1]=a,这是环的入口点本来这个链表正常是节点0到1,1到2…,n到n+1,n+1到null,但是没有n+1,而是链接成循环了,也就是没有尾节点例子[1,3原创 2022-01-21 11:54:11 · 192 阅读 · 0 评论 -
645. 错误的集合
要求:有一个数重复/丢失思路:class Solution {public: vector<int> findErrorNums(vector<int>& nums) { int n=nums.size(); vector<int> hash(n); int lost,dup; for(int i=0;i<n;++i){ hash[nums[i]-1]++;原创 2022-01-21 10:03:07 · 178 阅读 · 0 评论 -
378. 有序矩阵中第 K 小的元素
要求:rt,矩阵往右,下递增思路:法一:小根堆优先队列,每一行当作一个数组class Solution {public: int kthSmallest(vector<vector<int>>& matrix, int k) { struct point{ int val,i,j; point(int val,int i,int j):val(val),i(i),j(j){};原创 2022-01-22 09:47:53 · 165 阅读 · 0 评论 -
240. 搜索二维矩阵 II
要求:往下,往右递增的矩阵思路:往右往下同时dfs过不了,要走z字。先往右,若找到一个大的则此列及右边所有列排除。然后往下找,找到一个大的则左再往下,小的话直接往下。即下左下z字class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int i=0,j=0; int r=matrix.size(),v=matrix[原创 2022-01-20 19:55:46 · 261 阅读 · 0 评论 -
566. 重塑矩阵
要求:rt思路:class Solution {public: vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) { int rr=mat.size(),vv=mat[0].size(); if(r*c!=rr*vv)return mat; vector<vector<int>原创 2022-01-20 18:11:48 · 354 阅读 · 0 评论 -
283. 移动零
要求:移动数组里0到末尾思路:直接覆盖class Solution {public: void moveZeroes(vector<int>& nums) { int index=0; for(int i=0;i<nums.size();++i) if(nums[i])nums[index++]=nums[i]; for(;index<nums.size();++index)原创 2022-01-20 17:56:37 · 166 阅读 · 0 评论