一、有序数组的平方
解法一 快速排序
时间复杂度:O(n*logn)
//数组-有序数组的平方-快速排序
#include<bits/stdc++.h>
using namespace std;
int n;
int nums[100000];
int main(){
cin >> n;
for (int i = 0; i < n; i++){
cin >> nums[i];
nums[i] *= nums[i];
}
sort(nums, nums + n);
for (int i = 0; i < n; i++){
cout << nums[i] << " \n"[i == n - 1];
}
return 0;
}
解法二 双指针法
时间复杂度:O(n)
//数组-有序数组的平方-双指针法
#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
int n, l1, l2;
int nums[N], ans[N];
int main(){
cin >> n;
for (int i = 0; i < n; i++){
cin >> nums[i];
}
l2 = n - 1;
for (int k = n - 1; k >= 0; k--){
if (nums[l1] * nums[l1] >= nums[l2] * nums[l2]){
ans[k] = nums[l1] * nums[l1];
l1++;
}
else if (nums[l1] * nums[l1] < nums[l2] * nums[l2]){
ans[k] = nums[l2] * nums[l2];
l2--;
}
}
for (int i = 0; i < n; i++){
cout << ans[i] << " \n"[i == n - 1];
}
return 0;
}
二、长度最小的子数组
解法 双指针法
时间复杂度:O(n)
//数组-长度最小的子数组-双指针法
#include<bits/stdc++.h>
using namespace std;
const int MAX = 0x3f3f3f3f;
int minSize = MAX;
int n, target, slow, fast, sum;
int nums[100000];
int main(){
cin >> n;
for (int i = 0; i < n; i++){
cin >> nums[i];
}
cin >> target;
for (fast = 0; fast < n; fast++){
sum += nums[fast];
if (sum >= target){
minSize = min(minSize, fast - slow + 1);
}
while (sum - nums[slow] >= target){
sum -= nums[slow];
slow++;
minSize = min(minSize, fast - slow + 1);
}
}
if (minSize == MAX){
printf("0\n");
}else {
printf("%d\n", minSize);
}
return 0;
}
三、螺旋矩阵
解法 模拟
//数组-螺旋矩阵II
#include<bits/stdc++.h>
using namespace std;
int n, i = 1, j = 0;
int k = 1, l, r;
int a[22][22];
int main(){
cin >> n;
while (k <= n * n){
while (j < n && !a[i][j + 1]){
a[i][++j] = k++;
}
while (i < n && !a[i + 1][j]){
a[++i][j] = k++;
}
while (j > 1 && !a[i][j - 1]){
a[i][--j] = k++;
}
while (i > 1 && !a[i - 1][j]){
a[--i][j] = k++;
}
}
for (i = 1; i <= n; i++){
for (j = 1; j <= n; j++){
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
总结
第二题.长度最小的子数组有点像贪心或者动态规划的感觉,螺旋矩阵就是一个模拟题,只需要按部就班的模拟就好了,总统来说效果不错,数组方面问题不大。