石子移动问题

199 阅读2分钟

问题描述

小S正在玩一个关于石子的游戏,给定了一些石子,它们位于一维数轴的不同位置,位置用数组 stones 表示。如果某个石子处于最小或最大的一个位置,我们称其为端点石子

在每个回合,小S可以将一颗端点石子移动到一个未占用的位置,使其不再是端点石子。游戏继续,直到石子的位置变得连续,无法再进行任何移动操作。

你需要帮助小S找到可以移动的最大次数。


测试样例

样例1:

输入:stones = [7, 4, 9]
输出:2

样例2:

输入:stones = [6, 5, 4, 3, 10]
输出:3

他的意思是说在一条数轴上的不同位置(这些位置就是stones数组里的数字)放了石头,这些石头之间有间隔,让我们每次移动两端的石头插入到这些石头的中间。到最后这些石头是连续的,就是他们之间没有间隔。如果我们只关注最终状态和初始状态的话,我们可以发现这些石头不管怎么移动初始和最终都占一定数目的位置,只是石头之间空格的数量会变成0,我们要做的就是尽可能地把石头移动到这些空格,根据题目的条件:在每个回合,小S可以将一颗端点石子移动到一个未占用的位置,使其不再是端点石子,我们可以发现特定一边端点石子和离他最近的那颗石头之间的空格那个端点石子是不能用的,因为用了的话这个端点石子还是端点石子,不符合题意。所以我们可以计算这些石子之间有多少空格,减去其中那个最小的不符合题意那边石子的空格数就是答案。

import java.util.Arrays;

public class Main {
    public static int solution(int[] stones) {
        int length=stones.length;
        if(length<3){
            return 0;
        }
        int sum=0,temp;
        Arrays.sort(stones);

        for(int i=1;i<length;i++){
            temp=stones[i]-stones[i-1]-1;
            if (temp<0){
                continue;
            }
            sum+=temp;
        }
        int head=stones[1]-stones[0]-1,tail=stones[length-1]-stones[length-2]-1;
        int sub= Math.min(head, tail);

        return sum-sub;
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[]{7, 4, 9}) == 2);
        System.out.println(solution(new int[]{6, 5, 4, 3, 10}) == 3);
        System.out.println(solution(new int[]{1, 2, 3, 4, 5}) == 0);
    }
}