【问题标题】: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;
}

标签: java algorithm


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多