LeetCode 561. Array Partition I

1 题目

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 = min(1, 2) + min(3, 4).

Note:

    1. n is a positive integer, which is in the range of [1, 10000].
    2. All the integers in the array will be in the range of [-10000, 10000].

 

2 链接:

https://leetcode.com/problems/array-partition-i/description/

 

3  解题步骤:

 

3.1 first try

复制代码
 1 import java.math.*;
 2 import java.util.*;
 3 
 4 class Solution {
 5     public int arrayPairSum(int[] nums) {
 6         /* 1 2 3 4 5 6
 7         12 34 56 9
 8         13 25 46
 9         
10         -3 -2 -1  1 3 5
11         -3 -1 3 -1
12         
13         */
14         int[] bucket = new int[20000];
15         
16         for(int i = 0; i<bucket.length; i++) {
17             bucket[i] = -10001;
18         }
19         
20         for(int i=0; i<nums.length; i++) {
21             bucket[nums[i]+10000] = nums[i];
22         }
23         
24         //
25         ArrayList<Integer> sortedList = new ArrayList<Integer>();
26         for(int i= 0; i<bucket.length; i++) {
27             if(bucket[i] != -10001) {
28                 sortedList.add(bucket[i]);
29             }
30         }
31         
32         int pairSum = 0;
33         for(int i = 0; i<sortedList.size(); i++) {
34             //int[] currentPair = new int[2];
35             
36             pairSum = pairSum + Math.min(sortedList.get(i), sortedList.get(++i));
37         }
38             
39         return pairSum;
40  
41     
42     }
43 }
复制代码

结果:

1
2
3
4
5
6
7
Runtime Error Message: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:610)
    at java.util.ArrayList.get(ArrayList.java:386)
    at Solution.arrayPairSum(Solution.java:37)
    at __DriverSolution__.__helper__(__Driver__.java:8)
    at __Driver__.main(__Driver__.java:52)
Last executed input: [1,1]

 分析:

桶排序如何应对重复元素?

 

解决方案:

找到桶排序与计数排序的区别。

 

 

3. 2 二次提交:

复制代码
 import java.math.*;
 import java.util.*;
 
 class Solution {
     public int arrayPairSum(int[] nums) {
         /* 1 2 3 4 5 6
         12 34 56 9
         13 25 46
         
         -3 -2 -1  1 3 5
         -3 -1 3 -1
         
         */
         int[] countingArray = new int[20000];
         
         for(int i = 0; i<countingArray.length; i++) {
             countingArray[i] = 0;
         }
         
         for(int i=0; i<nums.length; i++) {
             countingArray[nums[i]+10000] ++;
         }
         
         //
         ArrayList<Integer> sortedList = new ArrayList<Integer>();
         
         for(int i= 0; i<countingArray.length; i++) {
             int currentCounting = countingArray[i];
             if( currentCounting != 0) {
                 for(int j=0; j<currentCounting; j++) {
                     sortedList.add(i-10000);
                 }
             }
         }
         
         int pairSum = 0;
         for(int i = 0; i<sortedList.size(); i++) {
             //int[] currentPair = new int[2];
             
             pairSum = pairSum + Math.min(sortedList.get(i), sortedList.get(++i));
         }
             
         return pairSum;
  
     
     }
 }
复制代码

 

 

结果:

复制代码
Runtime Error Message: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 20000
    at Solution.arrayPairSum(Solution.java:21)
    at __DriverSolution__.__helper__(__Driver__.java:8)
    at __Driver__.main(__Driver__.java:52)
Last executed input: [750
-6944
2360
-1825
-6118
1590
9662
534
6297
-8386
-1379
-43
-9929
-6705
2597
-755
-831
-7535
9749
-3990
38
-4169
-511
-8272
-9888
-8956
-1416
938
-8321
-3890
1228
8251
-9710
1941
-6560
3692
-5383
1630
-945
5703
-9439
6271
1905
-6000
6012
9648
-1201
8895
-1580
-1376
3641
3352
-164
3764
8503
-4103
5940
-1954
-8908
-5412
-5332
-9417
7380
-2677
-9476
8399
-6955
-2375
7810
-2744
-5133
-9137
5072
-6809
-1976
5902
6022
-2772
7303
816
6622
8094
5038
-7849
-5316
1260
3662
6733
2690
9119
3573
-6045
6043
7195
-5844
-1023
2893
-1099
6571
-5215
8759
-4358
7416
5527
-5127
9008
-7902
-6659
-5009
310
-8109
807
-6461
805
-2015
-4476
6226
7349
-2
5938
7412
8943
3128
-9262
-4785
3952
-3764
8030
-475
-7220
-6075
3569
3957
10000
5431
-5875
7550
2508
-579
-4094
-9472
478
9503
-8572
7554
-268
9845
-1627
8270
6152
-4597
-4220
1385
-6600
2151
-5498
-7224
4751
7958
5958
-5926
-7363
7325
6848
-2327
9557
6399
-2078
-9852
2440
7526
-5960
3442
154
9919
-3792
-9541
904
3801
-5763
4840
9222
5206
-2281
6735
3441
-4805
-8790
8751
3475
4658
-8025
-2511
-5387
8987
1562
-4799
261
115
-1370]
复制代码

 

分析:

常见数组越界问题。

 

3.3 修改边界后第三次提交

复制代码
 import java.math.*;
 import java.util.*;
 
 class Solution {
     public int arrayPairSum(int[] nums) {
         /* 1 2 3 4 5 6
         12 34 56 9
         13 25 46
         
         -3 -2 -1  1 3 5
         -3 -1 3 -1
         
         */
         int[] countingArray = new int[20001];
         
         for(int i = 0; i<countingArray.length; i++) {
             countingArray[i] = 0;
         }
         
         for(int i=0; i<nums.length; i++) {
             countingArray[nums[i]+10000] ++;
         }
         
         //
         ArrayList<Integer> sortedList = new ArrayList<Integer>();
         
         for(int i= 0; i<countingArray.length; i++) {
             int currentCounting = countingArray[i];
             if( currentCounting != 0) {
                 for(int j=0; j<currentCounting; j++) {
                     sortedList.add(i-10000);
                 }
             }
         }
         
         int pairSum = 0;
         for(int i = 0; i<sortedList.size(); i++) {
             //int[] currentPair = new int[2];
             
             pairSum = pairSum + Math.min(sortedList.get(i), sortedList.get(++i));
         }
             
         return pairSum;
  
     
     }
 }
复制代码

 

成功accpeted。

 

4 结果

 上图:

 

5 刷题总结:

 

本题本质上是一个计数排序问题。

 

posted @   Zhao_Gang  阅读(142)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2016-04-12 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)
点击右上角即可分享
微信分享提示