leetcode算法题3:分组,让每个组的最小者,相加之后和最大。想知道桶排序是怎么样的吗?
/*
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.
Example 1:
Input: [1,4,3,2]
Output: 4
Explanation: n is 2, and the maximum sum of pairs is 4.
Note:
n is a positive integer, which is in the range of [1, 10000].
All the integers in the array will be in the range of [-10000, 10000].
*/
int arrayPairSum(int* nums, int numsSize) {
}
题意:两两分组,然后取每组的最小值来求和,让和最大。
办法1:
* 把数组排序,升序。邻近的两个数作为一组。
* i=0开始,取nums[i*2]来相加,i=numsSize/2时结束。相加出来的值就是目标值。
* 时间复杂度O(nlogn)。
办法2:
* 桶排序。
以每个元素的值+10000作为索引。
* 需要多大的空间?
因为已知每个数的范围为[-10000,10000],所以需要20001长度的数组才能绝对容纳这些数。
* 具体如何排序?
* 初始化长度为20001的数组v,每个元素为
0。
* 遍历nums,假设每个数为i,以i+10000作为索引,命中数组中的某一个vi(bucket),使vi++。
* 排序后,如何求和?
遍历v,在vi不为0的情况下,取一个,放一个,取出来的加至sum。最终sum为目标值。i-10000为原数值。
* 时间复杂度O(n),使用空间换时间。
* 基础概念
* c提供的快排的函数为qsort,4个参数,第1参数为void*表示数组,第2个参数为元素的个数,第3个参数为每个元素的大小,最后一个参数为比较函数。比较函数为自定义函数,形式如下:
int comp(const void* l, const void* r) {
int lv = *((int*)l);
int rv = *((int*)r);
if (lv > rv) {
return 1;
}
else if (lv < rv) {
return -1;
}
return 0;
}
* 桶排序,是一种非比较的排序,比快排要快,但空间消耗也多。要求是,能事先确定每个数值的范围,保持创建的数组能够容纳所有的数。一般以数的值(或运算后的值)作为数组的索引,之后根据索引也能反算出原值。
* 桶排序后的结构可能是:
* 异或的办法可以作为”抓一放一”的手段,比如设j=1,每次j^=1,那j就会从1跟0间变化。
#include <stdio.h>
#include <stdlib.h>
int comp(const void* l, const void* r) {
int lv = *((int*)l);
int rv = *((int*)r);
if (lv > rv) {
return 1;
}
else if (lv < rv) {
return -1;
}
return 0;
}
int arrayPairSum(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), comp);
int i=0;
int sum = 0;
while (i < numsSize>>1) {
sum += nums[i++*2];
}
return sum;
}
int main(int argc, char *argv[])
{
int arr[] = {1, 4, 3, 2};
printf("%d\n", arrayPairSum(arr, sizeof arr/sizeof *arr));
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
vector<int> buckets(20001, 0);
for (auto i : nums) {
buckets[i+10000] ++;
}
int sum = 0;
for (int i = 0, j=1; i < 20001;) {
if (buckets[i] > 0) {
if (j==1) {
sum += i-10000;
}
j^=1;
buckets[i]--;
}
else {
i ++;
}
}
return sum;
}
int arrayPairSum2(vector<int>& nums) {
vector<int> buckets(20001, 0);
for (auto i : nums) {
buckets[i+10000] ++;
}
int sum = 0;
for (int i = 0, j=1; i < 20001; i++) {
while (buckets[i] > 0) {
if (j==1) {
sum += i-10000;
}
j^=1;
buckets[i]--;
}
}
return sum;
}
};
int main(int argc, const char *argv[])
{
Solution so;
int arr[] = {1,4,3,2};
vector<int> v(arr, arr+sizeof arr/sizeof *arr);
cout << so.arrayPairSum2(v) << endl;
return 0;
}
leetcode算法题3:分组,让每个组的最小者,相加之后和最大。想知道桶排序是怎么样的吗?的更多相关文章
- LeetCode算法题-Degree of an Array(Java实现)
这是悦乐书的第294次更新,第312篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697).给定一个由正整数组成的非空数组,该数组的度数被定义为任意 ...
- LeetCode算法题-Count Binary Substrings(Java实现)
这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串 ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- LeetCode算法题-Maximum Average Subarray I(Java实现)
这是悦乐书的第278次更新,第294篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第146题(顺位题号是643).给定由n个整数组成的数组,找到具有最大平均值的长度为k的 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)
这是悦乐书的第267次更新,第281篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581).给定一个整数数组,找到一个连续的子数组,按升序对该子数组 ...
- LeetCode算法题-Array Partition I(Java实现)
这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...
- LeetCode算法题-Longest Uncommon Subsequence I(Java实现)
这是悦乐书的第252次更新,第265篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第119题(顺位题号是521).给定一组两个字符串,您需要找到这组两个字符串中最长的不同 ...
- LeetCode算法题-Find Mode in Binary Search Tree(Java实现)
这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...
- LeetCode算法题-License Key Formatting(Java实现)
这是悦乐书的第241次更新,第254篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第108题(顺位题号是482).您将获得一个表示为字符串S的许可证密钥,该字符串仅包含字 ...
随机推荐
- phalcon——访问控制列表ACL
一个完整的使用实例(将acl封装成一个插件使用): use Phalcon\Acl; use Phalcon\Acl\Role; use Phalcon\Acl\Resource; use Phalc ...
- JAVA 的 Date、Calendar的常用用法
一.Date与String的互转用法,这里需要用到SimpleDateFormat Date date = new Date(); //设置格式 SimpleDateFor ...
- NLog在asp.net中的使用
一.关于安装 1.可以直接通过vs自带的Nuget包管理器来搜索下载,直接搜索"NLog": 注意,除了要安装第一个之外,一定要安装"NLog.Config", ...
- Python Fabric远程自动部署简介
Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务. 它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入. ...
- 微信小程序用setData修改数组或对象中的一个属性值
在page中有如下数组 data: { info:[ { name:"yuki", tou:"../img/head.jpg", zGong:130, gMon ...
- Spring框架学习之高级依赖关系配置(一)
上篇文章我们对Spring做了初步的学习,了解了基本的依赖注入思想.学会简单的配置bean.能够使用Spring容器管理我们的bean实例等.但这还只是相对较浅显的内容,本篇将介绍bean的相关更高级 ...
- Linux中gcc和g++
今天在Linux上编写一个小的C++程序运行,需要用到iostream中cout,一开始创建一个hello.c的文件编写如下代码: #include<stdio.h> #include&l ...
- h5 动画页面
伪元素上就不要做动画了,页面果然应该做一个测试一个啊 拿到设计稿一开始就先看看这个设计稿的布局,有一些是从页面顶部到底部都有效果的,这个时候就要考虑在 iPhone4 这样屏幕不够高的设备上如何保 ...
- 【深度学习系列】PaddlePaddle之数据预处理
上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的 ...
- 玩转 HTML5 下 WebGL 的 3D 模型交并补
建设性的立体几何具有许多实际用途,它用于需要简单几何对象的情况下,或者数学精度很重要的地方,几乎所有的工程 CAD 软件包都使用 CSG(可以用于表示刀具切削,以及零件必须配合在一起的特征).CSG ...