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

简介: 【算法集训暑期刷题营】7.21日题-数组

 👉引言


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

我们的算法之路


   所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨

     ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️

   💝 二分,💝 贪心,💝 并查集,💝 二叉树,💝 图论,💝 深度优先搜索(dfs),💝 宽度优先搜索(bfs),💝 数论,💝 动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

image.png


今日主题:数组


  👉⭐️第一题 💎


     ✨题目


     628. 三个数的最大乘积image.png


     ✨思路:


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


     ✨代码:


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);
    }
};

image.png


  👉⭐️第二题  💎


     ✨题目


     1365. 有多少小于当前数字的数字image.png

就是对原数组进行排序,然后对每个数,统计小于该数的个数,这里使用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;
}
};

image.png


  👉⭐️第三题  💎


     ✨题目


     945. 使数组唯一的最小增量image.png


     ✨思路:


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


     ✨代码:


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;
    }
};

image.png


  👉⭐️第四题  💎:


     ✨题目


      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。在一些(可能为零)操作之后,同时太高的桩的最大数量是多少?


image.png


     ✨代码:


#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();
}


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


相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
3月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
13 0
|
3月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
3月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
3月前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
3月前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积