169.小C的排序询问 题解及思路
169.小C的排序询问
问题描述
小C拿到了一个排列,她想知道在这个排列中,元素 和 是否是相邻的。排列是一个长度为 的数组,其中每个数字从 到 恰好出现一次。
你的任务是判断在给定的排列中, 和 是否是相邻的。
示例1:
输入:n = 4, a = [1, 4, 2, 3], x = 2, y = 4
输出:True
解释: 在a
数组中,x=2
与 y=4
处于相邻位置(不考虑先后顺序),返回True
示例2:
输入:n = 5, a = [3, 4, 5, 1, 2], x = 3, y = 2
输出:False
解释: 在a
数组中,x=3
与 y=2
不处于相邻位置,中间有元素[4,5,1]
,返回False
示例3:
输入:n = 6, a = [6, 1, 5, 2, 4, 3], x = 5, y = 2
输出:True
解释: 在a
数组中,x=5
与 y=2
处于相邻位置,返回True
解题思路
思路1
遍历数组a
(0<i<n-1),当遇到x
或y
时(即a[i]
==x
或a[i]
==y
时)
判断当前索引的前一元素和后一元素是否有另一元素
即a[i-1]
==x
或a[i+1]
==x
或是a[i-1]
==y
或a[i+1]
==y
由上述思路进一步思考,当先遇到x
时,怎么判断y
。当先遇到y
时,怎么判断x
我们可以先计算x
和y
的和,即int sum = x+y
当先遇到x
或y
时,判断x
或y
与前后元素之和是否等于sum
解决了判断先遇到x
还是先遇到y
的问题,减少了不必要的判断
java代码
public static boolean solution(int n, int[] a, int x, int y) {
int sum = x+y;
for (int i = 1; i < a.length-1; i++) {
if (a[i] == x || a[i] == y){
int temp = sum - a[i];
return a[i-1] == temp || a[i+1]== temp;
}
}
return false;
}
思路2
使用我们的滑动窗口,x
与y
相邻,可以看作一个长度为2的窗口,遍历数组滑动窗口判断窗口内元素是否为x
和y
即(a[left] == x && a[right] == y)
或(a[left] == y && a[right] == x)
java代码
public static boolean solution(int n, int[] a, int x, int y) {
// write code here
int left =0 ;
int right =1;
while (right<n){
if ((a[left] == x && a[right] == y) || (a[left] == y && a[right] == x) ){
return true;
}
left++;
right++;
}
return false;
}
吐槽
题目很简单,是真的简单题,相比其他比中等题难度还高的简单题实属难得。
题目简单,可直接使用思路1,不必过多考虑思路2,思路2代码观赏性不如思路1的代码,而且题目也没有真正的展示出滑动窗口的特性,属于是类滑动窗口