数组与矩阵 | ||
1. 把数组中的 0 移到末尾 | 思考后可做出 |
|
2. 改变矩阵维度 | 一开始可做出Ok |
|
3. 找出数组中最长的连续 1 | 一开始可做出Ok |
|
4. 有序矩阵查找 | 一开始未做出 | ※ |
5. 有序矩阵的 Kth Element | 一开始未做出 | ※ |
6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数 | 思考后可做出 |
|
7. 找出数组中重复的数,数组值在 [1, n] 之间 | 一开始未做出 | ※ |
8. 数组相邻差值的个数 | 一开始未做出 | ※ |
9. 数组的度 | 一开始未做出 | ※ |
10. 对角元素相等的矩阵 | 思考后可做出 |
|
11. 嵌套数组 | 做法可简化 | ※ |
12. 分隔数组 | 做法可简化 | ※ |
1. 把数组中的 0 移到末尾
283. Move Zeroes (Easy)
https://leetcode-cn.com/problems/move-zeroes/
2. 改变矩阵维度
566. Reshape the Matrix (Easy)
https://leetcode-cn.com/problems/reshape-the-matrix/submissions/
3. 找出数组中最长的连续 1
485. Max Consecutive Ones (Easy)
https://leetcode-cn.com/problems/max-consecutive-ones/
4. 有序矩阵查找
240. Search a 2D Matrix II (Medium)
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0||matrix[0].size()==0) return false;
int i=matrix.size()-1,j=0;
while(i>=0&&j<matrix[0].size())
if(matrix[i][j]==target) return true;
else if(matrix[i][j]<target) j++;
else i--;
return false;
}
};
5. 有序矩阵的 Kth Element
378. Kth Smallest Element in a Sorted Matrix ((Medium))
https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
二分法:
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
if(matrix.size()==0||matrix[0].size()==0) return false;
int n=matrix.size();
int left=matrix[0][0],right=matrix[n-1][n-1];
while(left<=right){
int mid=left+(right-left)/2;
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<n&&matrix[i][j]<=mid;j++)
cnt++;
if(cnt<k) left=mid+1;
else right=mid-1;
}
return left;
}
};
6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数
645. Set Mismatch (Easy)
https://leetcode-cn.com/problems/set-mismatch/
7. 找出数组中重复的数,数组值在 [1, n] 之间
287. Find the Duplicate Number (Medium)
https://leetcode-cn.com/problems/find-the-duplicate-number/
1. 双指针:类似有环链表
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow=0,fast=0;
do{
slow=nums[slow];
fast=nums[nums[fast]];
}while(slow!=fast);
slow=0;
while(slow!=fast){
slow=nums[slow];
fast=nums[fast];
}
return slow;
}
};
2. 二分法
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int l=1,r=nums.size()-1;
while(l<=r){
int mid=l+(r-l)/2;
int cnt=0;
for(int i=0;i<nums.size();i++)
if(nums[i]<=mid) cnt++;
if(cnt>mid) r=mid-1;
else l=mid+1;
}
return l;
}
};
8. 数组相邻差值的个数
667. Beautiful Arrangement II (Medium)
https://leetcode-cn.com/problems/beautiful-arrangement-ii/
下标从[0, k]中,偶数下标填充[1,2,3…],奇数下标填充[k + 1, k, k - 1…],后面[k + 1, n - 1]都是顺序填充
class Solution {
public:
vector<int> constructArray(int n, int k) {
vector<int> ret(n);
for(int i=0,j=0;i<=k;i++)
ret[i]=(i&1==1)?(k-j+2):++j;
for(int i=k+1;i<n;i++)
ret[i]=i+1;
return ret;
}
};
9. 数组的度
697. Degree of an Array (Easy)
https://leetcode-cn.com/problems/degree-of-an-array/
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
map<int,int> cnt,left,right;
int maxCnt=0,ret=nums.size();
for(int i=0;i<nums.size();i++){
cnt[nums[i]]++;
right[nums[i]]=i;
if(left.find(nums[i])==left.end()) left[nums[i]]=i;
maxCnt=max(maxCnt,cnt[nums[i]]);
}
for(int num:nums)
if(cnt[num]==maxCnt)
ret=min(ret,right[num]-left[num]+1);
return ret;
}
};
10. 对角元素相等的矩阵
766. Toeplitz Matrix (Easy)
https://leetcode-cn.com/problems/toeplitz-matrix/
11. 嵌套数组
565. Array Nesting (Medium)
https://leetcode-cn.com/problems/array-nesting/
class Solution {
public:
int arrayNesting(vector<int>& nums) {
int ret=0,n=nums.size();
for(int i=0;i<n;i++){
int cnt=0;
for(int j=i;nums[j]!=-1;){
cnt++;
int tmp=nums[j];
nums[j]=-1;
j=tmp;
}
if(cnt>ret) ret=cnt;
}
return ret;
}
};
12. 分隔数组
769. Max Chunks To Make Sorted (Medium)
https://leetcode-cn.com/problems/max-chunks-to-make-sorted/
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int ret=0,right=arr[0];
for(int i=0;i<arr.size();i++){
right=max(right,arr[i]);
if(right==i) ret++;
}
return ret;
}
};