Jerry's Blog

Recording what I learned everyday

View on GitHub


28 October 2019

LeetCode(51) -- 1033

by Jerry Zhang

P1033. Moving Stones Until Consecutive (Easy)

有三个数a, b, c。每次只能挪动两边的数向中间移动。问最少和最多移动多少次能使它们连续。

我的思路

如果三个数中,有任何一个数与其他两个数都不相连,那就至少要移动一次。如果三个数全是分开的,谁和谁都不相连,并且任何两个数之间的距离都不能为1(因为如果距离是1,另外那个数插到它们中间就可以了,不需要移动第二次),此时,需要移动第二次。

最多移动次数相对比较容易,先找出两侧的数之间的距离,每次移动距离减1,直到距离为2。

我的代码

public class E_1033_MovingStonesUntilConsecutive {
    public int[] numMovesStones(int a, int b, int c) {
        int[] ans = new int[2];
        if (Math.abs(a - b) != 1 && Math.abs(a - c) != 1 ||
                Math.abs(c - b) != 1 && Math.abs(a - b) != 1 ||
                Math.abs(c - b) != 1 && Math.abs(a - c) != 1) {
            ans[0]++;
        }
        if (Math.abs(a - b) != 1 && Math.abs(a - c) != 1 &&
                Math.abs(c - b) != 1 && Math.abs(a - b) != 1 &&
                Math.abs(c - b) != 1 && Math.abs(a - c) != 1 &&
                Math.abs(a - b) != 2 && Math.abs(a - c) != 2 &&
                Math.abs(c - b) != 2 && Math.abs(a - b) != 2 &&
                Math.abs(c - b) != 2 && Math.abs(a - c) != 2) {
            ans[0]++;
        }
        int max = Math.max(Math.abs(a - b), Math.abs(a - c));
        max = Math.max(max, Math.abs(b - c));
        ans[1] = max - 2;
        return ans;
    }

    public static void main(String[] args) {
        int[] ints = new E_1033_MovingStonesUntilConsecutive().numMovesStones(1, 2, 5);
        System.out.println("ints = " + Arrays.toString(ints));
    }
}

100%

最优解

class Solution {
    public int[] numMovesStones(int a, int b, int c) {
        int max = Math.max(a,Math.max(b,c));
        int min = Math.min(a,Math.min(b,c));
        int mid = 0;
        if(a!=min && a!=max) mid = a;
        if(b!=min && b!=max) mid = b;
        if(c!=min && c!=max) mid = c;
        int maxmove = max-min-2;
        if(maxmove == 0) return new int[]{0,0};
        if(max-mid<=2 || mid-min<= 2) return new int[]{1,maxmove};
        else return new int[]{2,maxmove};
    }
}

我自己的代码实在是太难看了。。。学习这个。先把最大值和最小值找到(不需要知道是谁),再把中间那个数找到。如果最大值和中间的距离小于等于2,或者最小值和中间数的距离小于等于2,则小最距离返回1,否则返回2。

tags: LeetCode