169.小C的排序询问 题解及思路 | 豆包MarsCode AI刷题

6 阅读2分钟

169.小C的排序询问 题解及思路

169.小C的排序询问

问题描述

小C拿到了一个排列,她想知道在这个排列中,元素 xxyy 是否是相邻的。排列是一个长度为 nn 的数组,其中每个数字从 11nn 恰好出现一次。

你的任务是判断在给定的排列中,xxyy 是否是相邻的。

示例1:

输入:n = 4, a = [1, 4, 2, 3], x = 2, y = 4 
输出:True

解释:a数组中,x=2y=4 处于相邻位置(不考虑先后顺序),返回True

示例2:

输入:n = 5, a = [3, 4, 5, 1, 2], x = 3, y = 2
输出:False

解释:a数组中,x=3y=2 不处于相邻位置,中间有元素[4,5,1],返回False

示例3:

输入:n = 6, a = [6, 1, 5, 2, 4, 3], x = 5, y = 2
输出:True

解释:a数组中,x=5y=2 处于相邻位置,返回True

解题思路

思路1

遍历数组a(0<i<n-1),当遇到xy时(即a[i]==xa[i]==y时)

判断当前索引的前一元素和后一元素是否有另一元素

a[i-1]==xa[i+1]==x或是a[i-1]==ya[i+1]==y

由上述思路进一步思考,当先遇到x时,怎么判断y。当先遇到y时,怎么判断x

我们可以先计算xy,即int sum = x+y

当先遇到xy时,判断xy与前后元素之和是否等于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

使用我们的滑动窗口,xy相邻,可以看作一个长度为2的窗口,遍历数组滑动窗口判断窗口内元素是否为xy

(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的代码,而且题目也没有真正的展示出滑动窗口的特性,属于是类滑动窗口