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的许可证密钥,该字符串仅包含字 ...
随机推荐
- LeetCode 604. Design Compressed String Iterator (设计压缩字符迭代器)$
Design and implement a data structure for a compressed string iterator. It should support the follow ...
- 一次从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- Spring框架学习之依赖注入
Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...
- 用C写的计算运行时间
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { long i ...
- Mysql修改已有数据的字符集
Mysql修改已有数据的字符集 问题 在生产环境中跑了很久,发现MysqlClient连接的字符集是默认的latin1,我们一直以为都是utf8,造成这样的误解,是因为在内网环境中,我们是源码编译的M ...
- AngularJS学习篇(十四)
AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...
- WebService-axis2
WebService框架有好多,常用的cxf,axis2等,axis2的配置过程相对简单,不用编写接口,在实现.只需要一个Service服务类即可.配置过程大致如下: 1,导入jar包(这里我是把ax ...
- 记一次list循环删除元素的突发事件!
事情是这样的,由于想再回顾一下基础,就写了一个main函数,里面循环删元素的代码.如下: List<String> a = new ArrayList<String>(); a ...
- c# 实体类生成工具
一个简单生成c#实体类的工具 源代码下载
- 使用dynamic特性处理XML文档
处理XML文档是我们经常需要进行的一项工作,尤其是在进行网络服务相关编程时,比如更新RSS等.在.NET 3.5中引入了Linq To XML,使得XML文档的读写已经大大简化,而.NET 4.0中最 ...