
法一:
cpp
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
while(k>0){
vector<int> nums1 = nums;
int tmp = nums1[n-1];
for(int i = 1; i<n; i++){
nums[i] = nums1[i-1];
}
nums[0] = tmp;
k--;
}
}
};
超出时间限制。总体思想很简单,就是每次循环时把变化前的数组记录下来,然后第一个元素是最后一个元素,其余都是把前一个元素赋值给当前元素。
法二:
cpp
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k % n;
if(k == 0){
return;
}
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin()+k);
reverse(nums.begin()+k, nums.end());
}
};
想法就是利用reverse,如nums = [1,2,3,4,5,6,7],k=3;那么先翻转整个数组[7,6,5,4,3,2,1],再翻转前k个[5,6,7,4,3,2,1],再翻转后面的[5,6,7,1,2,3,4],得到最终结果。但需要注意的是可能 k 会大于数组的大小,k如果等于数组的大小,那就最终会刚好翻转一遍和原数组相同,所以当k大于数组大小,就没有必要翻转那么多次,所以有k = k%n的步骤。

cpp
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<int> result(n*m, 0);
int count = 0;
int n1 = min(m, n)/2;
int i = 0, j = 0, startx = 0, starty = 0;
int offset = 1;
while(n1){
i = startx;
j = starty;
for(j ; j<n-offset; j++){
result[count] = matrix[i][j];
count++;
}
for(i; i<m-offset; i++){
result[count] = matrix[i][j];
count++;
}
for(j; j>=offset; j--){
result[count] = matrix[i][j];
count++;
}
for(i; i>=offset; i--){
result[count] = matrix[i][j];
count++;
}
startx++;
starty++;
offset++;
n1--;
}
if(min(n, m)%2 == 1){
if(m <= n){
for(j=starty; j<=n-offset; j++){
result[count] = matrix[startx][j];
count++;
}
}
else{
for(i=startx; i<=m-offset; i++){
result[count] = matrix[i][starty];
count++;
}
}
}
return result;
}
};
思路是一圈一圈的输出,最后最中间那块再单独处理输出一下。需要注意的是一圈一圈的输出是要按照相同的规律去输出的,如上代码就是左闭右开去输出的,然后每次都从(0, 0),(1, 1)这样的位置开始进行输出。最后最中间需要单独处理的也分两种情况,分为竖着的一列和横着的一行,然后进行赋值输出。定义count变量是方便可以[ ]进行赋值,不然要用push_back,可能会影响时间。

cpp
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
int n = matrix[0].size();
int i = 0;
int j = n-1;
while(i<m && j>=0){
if(target == matrix[i][j]){
return true;
}
else if(target < matrix[i][j]){
j--;
}
else{
i++;
}
}
return false;
}
};
思路是从右上角开始,当target>matrix[i][j]时,就往下进行移动去寻找,当target<matrix[i][j]时,就往左进行移动去寻找;如果是从左上角开始的话,那么往下和往右都是逐渐变大的。