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的许可证密钥,该字符串仅包含字 ...
随机推荐
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
- jsp页面接收json字符串
jsp页面接收 后台添加
- Web设计新手应知道的10个锦囊妙计
摘要:你在网页设计所学到的大多数教训都来自工作经验.学习是一个反复持续的过程,并且没有比犯错更好的方式来获得知识.在本文中,我们将讨论10个重要并常规的技巧,这是每位Web设计师新手都应该知道. 在做 ...
- Python Web框架篇:Django templates(模板)
为什么用templates? views.py视图函数是用来写Python代码的,HTML可以被直接硬编码在views.py之中.如下: import datetime def current_tim ...
- Python入门学习(一)
看完了莫烦Python的视频,对于Python有了一点感觉,接下来打算把小甲鱼的视频啃完,附上学习网址:http://blog.fishc.com/category/python 小甲鱼的视频是从零基 ...
- json标准是双引号
双引号才是json 的标准,单引号是不规范的(虽然在js 中是行的通的)!json 的名称和字符串值需要用双引号引起来,单引号的话,使用json.parse会出现错误
- RobotFramework自动化测试环境配置
现在工作是做自动化测试平台维护的,平台用的C#做的,主要是用来测试CMBRun项目,它是c/s结构的项目,而b/s结构的项目主要使用RF+Python来做.做这块之前听过自动化测试,身边的朋友也有做这 ...
- How to set up Dynamics CRM 2011 development environment
Recently I have been starting to learn Microsoft Dynamics CRM 2011 about implement plugin and workfl ...
- java获取当前上一周、上一月、上一年的时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calend ...
- Spring面试题目
问题清单: 1. 什么是Spring框架?Spring框架有哪些主要模块? 2. 使用Spring框架有什么好处? 3. 什么是控制反转(IOC)?什么是依赖注入? 4. 请解释下Spring中的IO ...