【算法集训暑期刷题营】7.1日题-数组

算法集训传送门

  👉引言

在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 ❄️我们的算法之路❄️💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

在这里插入图片描述


 👉⭐️第一题💎

   ✨题目

      628. 三个数的最大乘积
在这里插入图片描述

   ✨思路

首先进行排序,这里比较容易出错的就是 数组中会有负数,而这种情况就是取最小的两个负数,以及一个正数,与正常情况(最大的三个数)相比,返回较大值

   ✨代码
class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int num1= nums[n-1]*nums[n-2]*nums[n-3];
        int num2=nums[0]*nums[1]*nums[n-1];
        return max(num1,num2);
    }
};

在这里插入图片描述

 👉⭐️第二题💎

   ✨题目

      1365. 有多少小于当前数字的数字
在这里插入图片描述

就是对原数组进行排序,然后对每个数,统计小于该数的个数,这里使用STL中的map实现

   ✨代码
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
	map<int, int>ans;
	for (int i : nums) {
		ans[i]++;
	}
	for (int i = 0; i < nums.size(); i++) {
		int num = nums[i]; int sum = 0;
		for (map<int, int>::iterator it = ans.begin(); it != ans.end(); it++) {
			if (it->first != num)
			{
				sum += it->second;
				continue;
			}break;
		}nums[i] = sum;
	}
	return nums;
}
};

在这里插入图片描述

 👉⭐️第三题💎

   ✨题目

      945. 使数组唯一的最小增量
在这里插入图片描述

   ✨思路

当我们找到一个没有出现过的数的时候,将之前某个重复出现的数增加成这个没有出现过的数。注意,这里 「之前某个重复出现的数」 是可以任意选择的,它并不会影响最终的答案,这里先参考官方题解,等小编有能力了自己写一个

   ✨代码
   class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
       int C[800000]={0};
        for (int x : nums) {
            C[x]++;
        }

        int ans = 0, taken = 0;

        for (int x = 0; x < 800000; ++x) {
            if (C[x] >= 2) {
                taken += C[x] - 1;
                ans -= x * (C[x] - 1);
            }
            else if (taken > 0 && C[x] == 0) {
                taken--;
                ans += x;
            }
        }

        return ans;
    }
};

在这里插入图片描述

 👉⭐️第四题💎

   ✨题目

      B. Rising Sand

   ✨思路

有n堆沙子,其中第i堆沙子有a块沙子。如果1<i<n 且 ai>ai-1+ai+1,则第i个桩被称为太高。也就是说,如果一堆沙子比它的两个邻居加起来还多,那么它就太高了。(请注意,数组末端的堆不能太高。)给定一个整数k。一个操作包括连续拾取k堆沙子,然后向它们全部添加一个单位的沙子。形式上,选择1sl,rsn 使得r-l+1=k。然后对于所有Isisr,更新ai-ai+1。在一些(可能为零)操作之后,同时太高的桩的最大数量是多少?
在这里插入图片描述

   ✨代码
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX = 200007;
const int MOD = 1000000007;
 
void solve() {
	int n, k;
	cin >> n >> k;
	int a[n];
	for (int i = 0; i < n; i++) {
	    cin >> a[i];
	}
	if (k > 1) {
	    int res = 0;
	    for (int i = 1; i < n - 1; i++) {
	        res += (a[i] > a[i - 1] + a[i + 1]);
	    }
	    cout << res << '\n';
	}
	else {
	    cout << (n - 1) / 2 << '\n';
	}
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt; cin >> tt; for (int i = 1; i <= tt; i++) {solve();}
    // solve();
}

  ⭐️总结⭐️

前两题都是简单的思维题,后两题则有些难度,我也是参考了题解才做出来,这个故事告诉我们,遇到不会的不要死磕,看看题解,然后独立敲出来,日积月累,也就没什么题难得住自己了

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想new的出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值