Go语言题解LeetCode561数组拆分

目录
  • 一 描述
  • 二 分析
  • 三 答案
  • Python 语言 - 数组拆分
    • 解题思路
    • 代码一
    • 代码二
    • 代码三

一 描述

561. 数组拆分 I - 力扣(LeetCode) (leetcode-cn.com)

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。

返回该 最大总和 。

示例 1:

输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4

示例 2:

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9

提示:

1 <= n <= 10^4

nums.length == 2 * n

-10^4 <= nums[i] <= 10^4

二 分析

本质思路是将整个队列按从小到大的方式排序,然后从两个相近的数中选取出最小的,取和。使用冒泡法会超出计算时间,因为选用额外增加数组,将大小作为两个数组的下角标,从而进行排序。

三 答案

class Solution {
public:
    int arrayPairSum(vector<int>& nums) {
       /*
        int arr[nums.size()]={0};
        int temp=0;
        for(int i=0;i<nums.size();i++)
        arr[i]=nums[i];
        for(int i=0;i<nums.size()-1;i++)
        {
            for(int j=i+1;j<nums.size();j++)
            if(arr[i]>arr[j]) {temp=arr[i];arr[i]=arr[j];arr[j]=temp;}   //冒泡排序会超出时间限制
        }
        int res=0;
        for(int i=0;i<nums.size();i+=2){res+=arr[i];}
        return res;*/
        int n[20001]={0},i=0,j=0,sum=0;
        for(i=0;i<nums.size();i++)
        n[nums[i]+10000]++;        //变相将nums按顺序大小排好,并将顺序存储在n[i]中
        for(i=0;i<20001;)
        {
            if(n[i])
            {
                if(j%2==0) sum+=i-10000;     //按照n[i]中存储的顺序,求得nums[i]
                j++;                  //只有n[i]中有数时,即nums存在这个数时,j才增加,将j变为下角标
                n[i]--;           //此步防止nums中含有两个相同的数
            }
            else i++;
        }
        return sum;
    }
};

Python 语言 - 数组拆分

解题思路

排序

今天的题目意思为:把输入的数组拆成 nn 对,将每一对的最小值求和,得到的结果最大。

从题目给出的示例入手分析:

对于示例二 [6,2,6,5,1,2] :

题目给出了最优分法是 (2, 1), (2, 5), (6, 6),min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9。

假如我们换一种分法:(2, 6), (2, 5), (1, 6),min(2, 6) + min(2, 5) + min(1, 6) = 2 + 2 + 1 = 5,则得到的最终结果会变小。

可以看出小数字组成一对、大数字组成一对,每对取 minmin 之后,求和得到的结果才是最大的。

因此,思路就是对输入的数组 numsnums 进行排序,然后依次求相邻的两个元素的最小值,总和就是结果。

代码一

一种各种语言都比较通用的写法是下面这样,用 Python 作为示例:

class Solution(object):
    def arrayPairSum(self, nums):
        nums.sort()
        res = 0
        for i in range(0, len(nums), 2):
            res += min(nums[i], nums[i + 1])
        return res

时间复杂度:O(N * log(N)),超过了 31% 的提交。

空间复杂度:O(1)。

代码二

对于 Python 而言,我们可以用切片操作,把代码简化为:

class Solution(object):
    def arrayPairSum(self, nums):
        nums.sort()
        return sum(nums[::2])

时间复杂度:O(N * log(N)),超过了 100% 的提交,可见切片比 for 循环更快。

空间复杂度:O(N),切片操作产生了新的数组,占用了空间。

代码三

对于 Python 而言,上面的代码二还能继续精简到一行。由于 nums.sort() 是原地操作、没有返回值,所以我们需要用 sorted(nums) 函数返回一个新数组,我们才能在返回结果的基础上继续进行切片。

class Solution(object):
    def arrayPairSum(self, nums):
        return sum(sorted(nums)[::2])

时间复杂度:O(N * log(N)),超过了 63% 的提交,比方法二更慢。应该是 sorted() 函数拷贝了数组导致。

空间复杂度:O(N),sorted() 函数和切片操作产生了新的数组,占用了空间。

刷题心得

Easy 题经常从示例入手,分析解法。

本题练习了 Python 的切片操作,也练习了两种排序函数的写法。

以上就是Go语言题解LeetCode561数组拆分的详细内容,更多关于Go语言数组拆分的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言题解LeetCode674最长连续递增序列

    目录 题目描述 思路分析 AC 代码 题目描述 674. 最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度. 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列. 示例 1: 输入:nums = [1,3,5

  • go语言题解LeetCode1122数组的相对排序

    目录 题目描述 1122. 数组的相对排序 - 力扣(LeetCode) 给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中. 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同.未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾. 示例 1: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4

  • Go语言题解LeetCode705设计哈希集合

    目录 题目描述 思路分析 AC 代码 题目描述 705. 设计哈希集合 不使用任何内建的哈希表库设计一个哈希集合(HashSet). 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key . bool contains(key) 返回哈希集合中是否存在这个值 key . void remove(key) 将给定值 key 从哈希集合中删除.如果哈希集合中没有这个值,什么也不做.   示例: 输入: ["MyHashSet", "add&quo

  • go语言题解LeetCode1128等价多米诺骨牌对的数量

    目录 题目描述 思路分析 AC 代码 偷懒解法 思路: 图解: 代码: 哈希表+元素转换 解题思路 代码 复杂度分析 题目描述 1128. 等价多米诺骨牌对的数量 - 力扣(LeetCode) 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 

  • go语言题解LeetCode1160拼写单词示例详解

    目录 题目描述 思路分析 AC 代码 别人用int[26] 解题思路 代码 c++几乎双百的哈希解法 代码 题目描述 1160. 拼写单词 - 力扣(LeetCode) 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词. 注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次. 返回词汇表 words 中你

  • Go语言题解LeetCode599两个列表的最小索引总和

    目录 题目描述 思路分析 AC 代码 题目描述 599. 两个列表的最小索引总和 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答案并且不考虑顺序. 你可以假设答案总是存在. 示例 1: 输入: list1 = ["Shogun", "Tapioca Express", "Burger King&q

  • Go语言题解LeetCode561数组拆分

    目录 一 描述 二 分析 三 答案 Python 语言 - 数组拆分 解题思路 代码一 代码二 代码三 一 描述 561. 数组拆分 I - 力扣(LeetCode) (leetcode-cn.com) 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大. 返回该 最大总和 . 示例 1: 输入:nums = [1,4,3,2] 输出:4

  • go语言题解LeetCode989数组形式的整数加法

    目录 题目描述 思路分析 AC 代码 题目描述 989. 数组形式的整数加法 - 力扣(LeetCode) 整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组. 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] . 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 . 示例 1: 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234 示例 2: 输入:num

  • Go语言题解LeetCode724寻找数组的中心下标

    目录 题目描述 思路分析 AC 代码 题目描述 724. 寻找数组的中心下标 - 力扣(LeetCode) (leetcode-cn.com) 给你一个整数数组 nums ,请计算数组的 中心下标 . 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和. 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素.这一点对于中心下标位于数组最右端同样适用. 如果数组有多个中心下标,应该返回 最靠近左边 的那一个.如果数组不存在中心下标,返回 -

  • go语言题解LeetCode453最小操作次数使数组元素相等

    目录 题目描述 思路分析 AC 代码 小结 遍历数组一次 解题思路 代码 强行找规律 解题思路 代码 题目描述 原题链接 : 453. 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com) 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 .返回让数组所有元素相等的最小操作次数. 示例 1: 输入:nums = [1,2,3] 输出:3 解释: 只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3

  • go语言题解LeetCode88合并两个有序数组示例

    目录 题目描述 思路分析 AC 代码 题目描述 原题链接 : 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列. 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中.为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素

  • Go语言题解LeetCode888公平糖果交换示例详解

    目录 一 描述 二 分析 三 答案 一 描述 888. 公平的糖果交换 - 力扣(LeetCode) (leetcode-cn.com) 爱丽丝和鲍勃拥有不同总数量的糖果.给你两个数组 aliceSizes 和 bobSizes ,aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量. 两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果.一个人拥有的糖果总数量是他们每盒糖果数量的总和. 返回一个

  • go语言题解LeetCode66加一示例详解

    目录 题目描述 思路分析 AC 代码 小结 JavaScript 66题 代码 python3 循环判断 分析: JAVA解决进位问题 解题思路 代码 题目描述 原题链接 : 66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123. 示例 2:

随机推荐