zoukankan      html  css  js  c++  java
  • 【LEETCODE】39、第561题 Array Partition I

    package y2019.Algorithm.array;
    
    /**
     * @ProjectName: cutter-point
     * @Package: y2019.Algorithm.array
     * @ClassName: ArrayPairSum
     * @Author: xiaof
     * @Description: 561. Array Partition I
     * 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.
     *
     * 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).
     *
     * 给定一个长度为2n(偶数)的数组,分成n个小组,返回每组中较小值的和sum,使sum尽量大
     * @Date: 2019/7/2 17:24
     * @Version: 1.0
     */
    public class ArrayPairSum {
    
        public int solution(int[] nums) {
            //这个题的求每组中小的值,最后求和,尽量大,那就是说相近的数据最好放一组,不然差距很大,会导致最后值相差很大
            quikSort(nums, 0, nums.length);
            //排完序之后,叉开获取数据和即可
            int result = 0;
            for(int i = 0; i < nums.length; i += 2) {
                result += nums[i];
            }
            return result;
        }
    
        private void quikSort(int[] array, int left, int right) {
            if(left < right) {
                int mid = partitionSort(array, left, right);
                quikSort(array, left, mid);
                quikSort(array, mid + 1, right);
            }
        }
    
        private int partitionSort(int[] array, int left, int right) {
    //        if(left == right || left > right) {
    //            return left;
    //        }
    
            int midValue = array[left];
            int start = left;
            int end = right;
    
            //分区排序
            do {
    
                do { ++ start; } while(start < right && array[start] < midValue);
    
                do {
                    --end;
                } while(left < end && array[end] > midValue);
    
                //交换
                if(start < end) {
                    int temp = array[start];
                    array[start] = array[end];
                    array[end] = temp;
                }
    
            } while(start < end);
    
            //交换完毕之后,最后吧坑填上,这个时候left和right错开一位,所以right再left的左边
            array[left] = array[end];
            array[end] = midValue;
    
            return end;
        }
    
        public static void main(String args[]) {
            int A1[] = {1,4,3,2};
            ArrayPairSum fuc = new ArrayPairSum();
            System.out.println(fuc.solution(A1));
        }
    
    }
  • 相关阅读:
    解读《TCP/IP详解》(卷1):05章:RARP(逆地址解析协议)
    Android中利用“反射”动态加载R文件中的资源
    “骆驼”怎么写
    eclipse无法访问genymotion模拟器下/data/data文件解决方案
    解读《TCP/IP详解》(卷1):03章:IP(网际协议)
    解读《TCP/IP详解》(卷1):02章:链路层
    hdu1039 java正则表达式解法
    hdu1027 又是next_permutaiton
    hdu1261 java水过高精度排列组合。。
    hdu1716 STL next_permutation函数的使用
  • 原文地址:https://www.cnblogs.com/cutter-point/p/11128142.html
Copyright © 2011-2022 走看看