排列数组,使相邻的空间更小[关闭]

Posted

技术标签:

【中文标题】排列数组,使相邻的空间更小[关闭]【英文标题】:Arrange array so adjacent has less space [closed] 【发布时间】:2022-01-23 22:38:12 【问题描述】:

我有一个偶数大小的数组,现在我想从数组中只删除 2 个元素并找到相邻对,使得相邻元素之间的差异之和最小。

示例:

array size even say 8.
array elements : 1,3,4,6,3,4,100,200

Ans:
5

说明:

这里我将删除 100 和 200,这样我就可以得到相邻的最小总和。所以剩下的元素是 [1,3,4,6,3,4] 我选择的相邻对是:(1 3) = |3-1| = 2 , (4 3) = |4-3|=1, (6 4) = |6-4| = 2。所以总和 = 2 + 1 + 2 = 5

示例:

array size even say 4.
array elements : 1,50,51,60

Ans:
1

说明:这里我将删除 1 和 60,这样我将得到最小的和。 所以剩下的元素是 [50, 51],与相邻的 [50 51] = 1 相同。我的代码在这种情况下将失败并返回 49。

如何在java中实现这一点?

我尝试像这样对元素进行排序,但这对于所有类型的输入都不是正确的方法。

public static int process(int[] a) 
   int n = a.length;
   int n1 = n/2-1;
   Arrays.sort(arr);
   int sum = 0;
   for(int i=0; i<n1*2; i+=2) 
     sum += a[i+1] - a[i];
   
   return sum;

【参考方案1】:

您需要首先对数组进行排序,因为我们总是希望具有相似大小的元素彼此靠近。

然后,我们选择所有可以删除的两对:(n(n-1)/2) 对。计算每次移除的值并返回最小值。

【讨论】:

【参考方案2】:

代码:

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main 

    public static void main(String[] args) 
        int[] arr = new int[] 1,3,4,6,3,4,100,200;

        System.out.println("Array size even say: " + arr.length);
        System.out.println("Array elements:" + Arrays.toString(arr));
        
        /*
         * Sorting
         */
        arr = IntStream.of(arr).sorted().toArray();
        System.out.println("Sorted Array: " + Arrays.toString(arr));
        
        int sum = 0;
        for (int i = 0; i < arr.length-2; i+=2) 
            sum += arr[i+1] - arr[i];
        

        System.out.println("\nAns: " + sum);
    


控制台:

Array size even say: 4
Array elements:[1, 50, 51, 60]
Sorted Array: [1, 50, 51, 60]

Ans: 49

(也许我还是误会了你,如果是这样,那么请在这个答案下面的 cmets 中写下什么是错的)


编辑:

代码:


        int[] arr = new int[] 1,3,4,6,3,4,100,200; // with [100,200,1,3,4,6,3,4] answer is the same
        System.out.println("Array size even say: " + arr.length);
        System.out.println("Array elements:" + Arrays.toString(arr));
        
        int maxSum = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = 0; i < arr.length; i+=2) 
            int thisSum = arr[i+1] - arr[i];
            sum += thisSum;
            if(thisSum > maxSum) 
                maxSum = thisSum;
            
        

        System.out.println("\nAns: " + (sum-maxSum));

控制台:

Array size even say: 8
Array elements:[1, 3, 4, 6, 3, 4, 100, 200]

Ans: 5

【讨论】:

以上是关于排列数组,使相邻的空间更小[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Adobe Acrobat Pro 使所有页面的尺寸相同[关闭]

Angular:使用打开和关闭sidenav(Angular Materials)使div填充剩余的水平空间

通过特定属性过滤和排列[关闭]

将两组十列重新排列成两列[关闭]

如何使两个表行之间的空间更小css

在Javascript中使数组中的所有数字成为绝对值[关闭]