子数组问题&螺旋矩阵

一、有序数组的平方

题目链接

解法一 快速排序

时间复杂度: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;
}

总结

第二题.长度最小的子数组有点像贪心或者动态规划的感觉,螺旋矩阵就是一个模拟题,只需要按部就班的模拟就好了,总统来说效果不错,数组方面问题不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值