力扣第312场周赛+AcWing第70场周赛补题

力扣

一.按身高排序

1.原题链接:力扣

2.解题思路:

        如果后者身高大于前者身高,则交换身高同时交换姓名,最后输出names即可。

3.参考代码:

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        for(int i = 0; i < names.size(); i++){
            for(int j  = i + 1; j < names.size(); j++){
                if(heights[j] > heights[i]){
                    swap(heights[j] , heights[i]);
                    swap(names[j], names[i]);
                }
            }
        }
        return names;
    }
};

2.按位与最大的最长子数组

1.原题链接:力扣

2.解题思路:

        根据按位与运算的特性,a AND b <= min(a, b),则题目转化为实际上就是求数组中最大的元素最多连续出现了几次。

3.参考代码:

class Solution {
public:
    int longestSubarray(vector<int>& nums) {
        int MAX = 0;
        for(auto x : nums)MAX = max(MAX, x);
        int ans = 0, res = 0;
        for(auto & x : nums){
            if(x == MAX)res++;
            else{
                ans = max(ans, res);
                res = 0;
            }
        }
        ans = max(ans, res);
        return ans;
    }
};

3.找到所有好下标

1.原题链接:力扣

2.解题思路:

        用数组f[n],g[n]分别记录好下标之前连续非递增的元素的个数以及之后连续非递减的元素的个数,最后若长度满足f[n],g[n]都大于k,则将好下标插入ans,最后输出ans即可。

3.参考代码:

class Solution {
public:
    vector<int> goodIndices(vector<int>& nums, int k) {
        int n  = nums.size();
        vector<int>f(n), g(n);
        for(int i = 0; i < n; i++){
            f[i] = 1;
            if(i && nums[i] <= nums[i - 1])f[i] = f[i - 1] + 1;
        }
        for(int i = n - 1; i >= 0; i--){
            g[i] = 1;
            if(i + 1 < n && nums[i] <= nums[i + 1])g[i] = g[i + 1] + 1;
        }
        vector<int>ans;
        for(int i = k; i < n - k; i++){
            if(f[i - 1] >= k && g[i + 1] >= k)ans.push_back(i);
        }
        return ans;
    }
};

AcWing

一.两个素数

1.原题链接:4618. 两个素数 - AcWing题库

2.解题思路:

        用p(m)判断m是否为素数。

3.参考代码:

#include<algorithm>
#include<cstring>
#include<bits/stdc++.h>

using namespace std;

bool  p(int  m)
{
    if(m == 1)return 0;
    for(int i = 2; i <= m / i; i++){
        if(m % i == 0)return false;
        return true;
    }
}

int main()
{
    int x;
    cin >> x;
    for(int i = 2; i <= x / i; i++){
        if(p(i) && p(x / i) && i <= x / i && x % i == 0){
            cout << i << ' ' << x / i;
        }
    }
                return 0;
}

二.减法操作

1.原题链接:4619. 减法操作 - AcWing题库

2.解题思路:

        遍历数组,若元素为奇数,则自减一且后一元素也减一,若最终数组中的元素全为偶数或者为非负数,则说明可以满足题意,输出“YES”,反之输出“NO”;

3.参考代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int>a(n);
    for(int i = 0; i < n; i++)cin >> a[i];
    for(int i = 0; i < n - 1; i++){
        if(a[i] % 2)a[i]--, a[i + 1]--;
    }
    int s = 0;
    for(int i = 0; i < n; i++){
        s += a[i] % 2 || a[i] < 0;
    }
    if(!s)cout << "YES";
    else cout << "NO";
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值