专业移动网站建设,哪一家网站做简历,北京网络科技公司名单,p2p网站如何建设题目链接
LeetCode-1033. 移动石子直到连续
题目描述 题解
题解一#xff08;Java#xff09; 作者#xff1a;仲景 这题目挺难懂的#xff0c;得画画图才能更好的理解 这也是LeetCode的尿性#xff0c;习惯了#xff0c;非得整这种别人看不懂的鸟语 你可以这样理解Java 作者仲景 这题目挺难懂的得画画图才能更好的理解 这也是LeetCode的尿性习惯了非得整这种别人看不懂的鸟语 你可以这样理解给你一个假设长度为无穷的数组其中有3个下标的位置赋值成了1其余的都是0 问你每次只能从头尾选择移动1次最多多少次能让着3个1排到一起最少多少次能让着3个1排到一起 这样也许会更好懂一些 先说最多的情况最多的情况就是左边的1每次1步一直移动到中间的1的前一个索引位置右边的1每次1步一直移动到中间的1的后一个索引位置 首先左右两个1的距离应该是 c-a-1因为中间还有一个b所以还要-1那么最多的公式就是c-a-2 那么最少情况呢可以分成好多种 情况一abc本身索引就是连续的不需要动 情况二ab连续或者bc连续只需要把另外一个挪过来就可以了移动1次 情况三abc之间有空隙但是空隙只有1个那么随便挪动另外一个过来最少也是移动1次 情况四abc之间有空隙但是空隙很多所有a移动到b的前一个位置需要1次c移动到b的后一个位置需要1次那么最少也得2次 所有情况就已经讲完了下面的图和情况1234不是一一对应的只是用来证明情况1234的图 class Solution {public int[] numMovesStones(int a, int b, int c) {int[] arr {a, b, c};Arrays.sort(arr);a arr[0];b arr[1];c arr[2];int min 0;// 如果c和a相差2那abc就是连续的不需要移动// 只有c和a之间有超过1个格子的时候才需要移动if (c - a 2) {if (b - a 2 || c - b 2) {// 如果abc之中有任何两个元素紧挨着或者中间只有一个格子的时候最少只需要1次就够了min 1;} else {// 如果abc之中没有任何一个格子紧挨或者相差1个格子那么最少需要2次min 2;}}// 最多就是c-a-2return new int[]{min, c - a - 2};}
}