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