给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
首先进了暴力法,想都不用想,超时,实在没想到可以有上面简便的方法,看了题解
题解1
采用额外数组,将原始数组中每一个元素下标加上k之后,再对数组大小取余,则将判断出会位于新数组中的上面位置,再将此新数组转换给旧数组,完成解答。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> newArr(n);
for (int i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};
题解2
太秒了,先将整个数组翻转,再翻转第一个到k个值,然后再翻转k到最后一个,这样就完成了翻转。
class Solution {
public:
void reverse(vector<int>&nums,int start,int end)
{
while(start<end)
{
swap(nums[start],nums[end]);
start++;
end--;
}
}
//数组的旋转
//整体向右移动K个值,并且后面的值得轮到前面来
void rotate(vector<int>& nums, int k) {
k %=nums.size();
reverse(nums,0,nums.size()-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
}
};
本题真的很秒,跟迭代能扯上关系是真的没想到。
题解真的太秒了,采用倒叙的方式,直接将F(1)到F(n-1)全部计算完毕,再取最大值。
class Solution {
public:
int maxRotateFunction(vector<int>& nums) {
int f = 0, n = nums.size();
int numSum = accumulate(nums.begin(), nums.end(), 0);
for (int i = 0; i < n; i++) {
f += i * nums[i];
}
int res = f;
//全体起立 这里真牛逼
for (int i = n - 1; i > 0; i--) {
f += numSum - n * nums[i];
res = max(res, f);
}
return res;
}
};
没什么算法,纯属对数组的理解与对数组下标的理解。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>result;
if(matrix.empty())return result;
int u=0;
int d=matrix.size()-1;
int l=0;
int r=matrix[0].size()-1;
while(true)
{
for(int i=l;i<=r;i++)
{
result.push_back(matrix[u][i]);
}
if(++u>d)break;
for(int i=u;i<=d;i++)
{
result.push_back(matrix[i][r]);
}
if(--r<l)break;
for(int i=r;i>=l;i--)
{
result.push_back(matrix[d][i]);
}
if(--d<u)break;
for(int i=d;i>=u;i--)
{
result.push_back(matrix[i][l]);
}
if(++l>r)break;
}
return result;
}
};
本题与上题类似。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>result(n,vector<int>(n));
int u=0;
int d=n-1;
int l=0;
int r=n-1;
int cur=1;
while(true)
{
for(int i=l;i<=r;i++)
{
result[u][i]=cur;
if(cur>=n*n) break;
cur++;
}
if(++u>d)break;
for(int i=u;i<=d;i++)
{
result[i][r]=cur;
if(cur>=n*n) break;
cur++;
}
if(--r<l)break;
for(int i=r;i>=l;i--)
{
result[d][i]=cur;
if(cur>=n*n) break;
cur++;
}
if(--d<u)break;
for(int i=d;i>=u;i--)
{
result[i][l]=cur;
if(cur>=n*n) break;
cur++;
}
if(++l>r)break;
}
return result;
}
};