目录
说明
方法 1
示例
输出
时间和空间复杂度
地图方法
结论
首页 后端开发 C++ 将以下内容翻译为中文:最大化从数组中选择的数字的和,使其变为空

将以下内容翻译为中文:最大化从数组中选择的数字的和,使其变为空

Aug 29, 2023 am 11:25 AM
数组 编程最大化 变为空

将以下内容翻译为中文:最大化从数组中选择的数字的和,使其变为空

我们将得到一个数组,必须从中选择一个元素并将该元素添加到总和中。将该元素添加到总和中后,我们必须从数组中删除三个元素(如果存在当前数字、当前数字 -1 和当前数字 + 1)。通过此方法,我们将使数组为空并得到总和。最后,我们必须使总和最大。

Input: [ 1, 2, 3]
Output: 4 
登录后复制

说明

一开始,我们可以有 3 步,删除 1、2 或 3。

  • 让我们删除 1,然后我们必须删除 0、1 和 2(如果存在其中任何一个,则必须至少存在其中一个)。我们将得到总和等于 1,数组将只剩下 3。删除 3 后,我们将得到总和等于 4。

  • 让我们删除 2,然后我们必须删除 1、2 和 3,最终的总和将为 2。

  • 先删除 3,那么 sum 为 3,数组为 1。删除 1 后,sum 为 4。

Input: [ 1, 2, 2, 2, 3, 3]
Output: 8
登录后复制

我们可以删除前两个三,这将给我们 6,然后两个二将被删除。

之后我们将删除剩下的两个中的一个并得到 8 作为答案。

方法 1

在这种方法中,我们将首先获取数组中存在的最大元素,以获取数组中存在的元素的频率。

稍后我们将创建一个数组来存储给定数组中存在的元素的频率。

我们将从频率数组的最后一个元素开始遍历,因为我们必须从数组中删除当前的一个减号和一个加号元素,这将始终保存比其大一的数字,从而得到最大总和:结果。

示例

#include <iostream>
using namespace std;
int maxElement(int arr[], int n){
   int mx = arr[0]; // defining variable to store the maximum element
   for(int i=1; i<n; i++){
      if(mx < arr[i]){
         mx = arr[i];
      }
   }
   return mx;
}
int maxSum(int arr[], int n){
   // getting the maximum element first 
   int mx = maxElement(arr,n);
   // creating array of maximum size to store frequecny of the elements 
   int freq[mx+1] = {0}; // defining each element as zero first 
   // getting the frequecny of the elements 
   for(int i=0; i<n; i++){
      freq[arr[i]]++;
   }
   int ans = 0; // variable to store the answer 
   // traversing over the array 
   for(int i=mx; i>0; i--){
      if(freq[i] > 0){
         ans += freq[i]*i;
         freq[i-1] -= freq[i];
      }
   }
   return ans;
}
int main(){
   int n; // number of elements in the given array 
   int arr[] = { 1, 2, 2, 2, 3, 3}; // given array
   n = sizeof(arr)/sizeof(arr[0]);
   // calling the function to get the answer 
   cout<<"The maximum sum we can get by deleting the elements is: "<<maxSum(arr,n);
}
登录后复制

输出

The maximum sum we can get by deleting the elements is: 8
登录后复制
登录后复制

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是给定数组中存在的最大元素。

上述代码的空间复杂度与时间复杂度相同,均为 O(N),因为我们创建了一个数组来存储元素的频率。

前面给出的方法有一个问题,如果最大元素非常大,则需要大量时间和空间来解决问题。为了解决这个问题,我们有下一个方法。

地图方法

在这种方法中,我们将创建映射来存储元素的频率而不是数组,想法是相同的。

示例

#include <bits/stdc++.h>
using namespace std;
int maxSum(int arr[], int n){
   // sorting the array to travers over the map from last 
   sort(arr,arr+n);
   // creating the map 
   unordered_map<int,int>mp;
   // getting the frequecny of the elements 
   for(int i=n-1; i>=0; i--){
      mp[arr[i]]++;
   }
   int ans = 0; // variable to store the answer 
   // traversing over the array 
   for(int i=n-1; i>=0; i--){
      if (mp.count(arr[i])) {
         ans += arr[i];
         mp[arr[i]]--;
         // if element frequency in map become zero
         // than remove that element
         if (mp[arr[i]] == 0){
            mp.erase(arr[i]);
         }
         if (mp.count(arr[i] - 1)){
            mp[arr[i] - 1]--;
            if (mp[arr[i] - 1] == 0){
               mp.erase(arr[i] - 1);
            }
         }
      }
   }
   return ans;
}
int main(){
   int n; // number of elements in the given array 
   int arr[] = { 1, 2, 2, 2, 3, 3}; // given array
   n = sizeof(arr)/sizeof(arr[0]);
   // calling the function to get the answer 
   cout<<"The maximum sum we can get by deleting the elements is: "<<maxSum(arr,n);
}
登录后复制

输出

The maximum sum we can get by deleting the elements is: 8
登录后复制
登录后复制

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是给定数组中存在的元素数量。

上述代码的空间复杂度与时间复杂度相同,均为 O(N),因为我们创建了一个映射来存储元素的频率。

结论

在本教程中,我们实现了一个 C++ 程序,用于最大化数组中所选数字的总和,使其为空。我们必须从中选择一个元素并将该元素添加到总和中。将该元素添加到总和中后,如果存在当前数、当前数-1和当前数+1,我们必须从数组中删除三个元素。我们已经实现了两种具有线性时间和空间复杂度的频率基础方法。 p>

以上是将以下内容翻译为中文:最大化从数组中选择的数字的和,使其变为空的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1663
14
CakePHP 教程
1420
52
Laravel 教程
1313
25
PHP教程
1266
29
C# 教程
1238
24
如何使用 foreach 循环去除 PHP 数组中的重复元素? 如何使用 foreach 循环去除 PHP 数组中的重复元素? Apr 27, 2024 am 11:33 AM

使用foreach循环去除PHP数组中重复元素的方法如下:遍历数组,若元素已存在且当前位置不是第一个出现的位置,则删除它。举例而言,若数据库查询结果存在重复记录,可使用此方法去除,得到不含重复记录的结果。

PHP数组深度复制的艺术:使用不同方法实现完美复制 PHP数组深度复制的艺术:使用不同方法实现完美复制 May 01, 2024 pm 12:30 PM

PHP中深度复制数组的方法包括:使用json_decode和json_encode进行JSON编码和解码。使用array_map和clone进行深度复制键和值的副本。使用serialize和unserialize进行序列化和反序列化。

PHP 数组键值翻转:不同方法的性能对比分析 PHP 数组键值翻转:不同方法的性能对比分析 May 03, 2024 pm 09:03 PM

PHP数组键值翻转方法性能对比表明:array_flip()函数在大型数组(超过100万个元素)下比for循环性能更优,耗时更短。手动翻转键值的for循环方法耗时相对较长。

PHP数组多维排序实战:从简单到复杂场景 PHP数组多维排序实战:从简单到复杂场景 Apr 29, 2024 pm 09:12 PM

多维数组排序可分为单列排序和嵌套排序。单列排序可使用array_multisort()函数按列排序;嵌套排序需要递归函数遍历数组并排序。实战案例包括按产品名称排序和按销售量和价格复合排序。

PHP 数组分组函数在数据整理中的应用 PHP 数组分组函数在数据整理中的应用 May 04, 2024 pm 01:03 PM

PHP的array_group_by函数可根据键或闭包函数对数组中的元素分组,返回一个关联数组,其中键是组名,值是属于该组的元素数组。

深度复制PHP数组的最佳实践:探索高效的方法 深度复制PHP数组的最佳实践:探索高效的方法 Apr 30, 2024 pm 03:42 PM

在PHP中执行数组深度复制的最佳实践是:使用json_decode(json_encode($arr))将数组转换为JSON字符串,然后再将其转换回数组。使用unserialize(serialize($arr))将数组序列化为字符串,然后将其反序列化为新数组。使用RecursiveIteratorIterator迭代器对多维数组进行递归遍历。

PHP 数组分组函数在查找重复元素中的作用 PHP 数组分组函数在查找重复元素中的作用 May 05, 2024 am 09:21 AM

PHP的array_group()函数可用于按指定键对数组进行分组,以查找重复元素。该函数通过以下步骤工作:使用key_callback指定分组键。可选地使用value_callback确定分组值。对分组元素进行计数并识别重复项。因此,array_group()函数对于查找和处理重复元素非常有用。

探索 PHP 数组去重算法的复杂度 探索 PHP 数组去重算法的复杂度 Apr 28, 2024 pm 05:54 PM

PHP数组去重算法的复杂度:array_unique():O(n)array_flip()+array_keys():O(n)foreach循环:O(n^2)

See all articles