今日头条后台笔试第一道编程题解法

当时没做完,后来花了一点时间把它做完,应该是ac了,但是时间复杂度可能有点高。

题目大概是这样的:假设有一点x,其右上区域没有任何点,输出符合条件的点x。

思路是这样的:

1.先按照x轴的值对坐标点进行排序,最后一个点无论如何都满足条件。

2.再依次比较y轴的值,由于x值已经排好序(由小到大),y值只要遇到后面有比它大的,该点就不符合条件,继续循环判断下一个点是否符合条件。如果某一个点,其y值大于后面所有点的y值,该点符合条件,输出(注意是大于其后的所有的点的y值,前面有点的y值大于它,它仍旧符合条件,因为前面的点的x值是小于它的)。
代码如下:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc1 = new Scanner(System.in);
        int n = sc1.nextInt();
        int[][] intArray = new int[n][2];
        String str1 = null;
        Scanner sc2 = new Scanner(System.in);
        for(int i = 0; i < n; i++) {
             str1 = sc2.nextLine();
             String[] strArray = str1.split(" ");
             intArray[i][0] = Integer.parseInt(strArray[0]);
             intArray[i][1] = Integer.parseInt(strArray[1]);
        }
        //按x值,由小到大进行排序
        for(int i = 0; i < n - 1; i++) {
            for(int j = 0; j < n - i - 1; j++) {
                if(intArray[j][0] > intArray[j+1][0]) {
                    //将x轴值进行交换
                    int temp1 = intArray[j][0];
                    intArray[j][0] = intArray[j+1][0];
                    intArray[j+1][0] = temp1;
                    //y轴值必须跟着x走,作相同交换
                    int temp2 = intArray[j][1];
                    intArray[j][1] = intArray[j+1][1];
                    intArray[j+1][1] = temp2;
                }
            }
        }
        //对y值进行比较,由于x已经从小到大排序,只要后面数组的y值有更大的,该数组不满足条件
        int x ;
        for(int i = 0; i < n; i++){
            for(x = i + 1; x < n; x++){
                if(intArray[i][1] < intArray[x][1]) {

                    break;
                }
            }
            if(x == n || i == n) {
                System.out.print(intArray[i][0]);
                System.out.print(" ");
                System.out.print(intArray[i][1]);
                System.out.println();
            }
        }

    }
}
#字节跳动##Java工程师#
全部评论
对x和y都建立一个排序的数组,遍历x排序的那个数组,用二分查找在y排序的数组中找到当前点在y排序数组中的位置,开始在y数组中比较x,y数组中后面所有点的x都小于当前点的x才满足条件。排序是nlgn,后面每次二分查找是lgn,所以总复杂度还是nlgn,正好可以过。
点赞 回复 分享
发布于 2017-08-22 23:53
我用的这方法,50%
点赞 回复 分享
发布于 2017-08-22 23:37
我用的这方法,0%_(:з」∠)_
点赞 回复 分享
发布于 2017-08-22 23:42
想一个极端的例子,如果排序后,所有点的y值是递减的,也就是所有点都是符合条件的,那这个算***在每个点都把后面的所有点都遍历一遍
点赞 回复 分享
发布于 2017-08-22 23:44
我也是这个思路 50% 对于大数来说好像不对 应该是超内存或者超时 后来改用先按x排列一次 然后从x最大的开始 首先这个点一定满足 记下maxy 其次往前遍历 只要y>=maxy就满足 之后记maxy=y 并继续向前查询 直到最后 讲之前满足条件的项都逆向输出 这样时间复杂度是nlogn+n 说了这么多 我也才通过了50% 问问各位大佬 这个思路有什么bug吗
点赞 回复 分享
发布于 2017-08-23 00:04
nlogn,感觉没问题啊,为啥只有50%呢?
点赞 回复 分享
发布于 2017-08-23 00:43
按照Y作为优先级扔到优先队列里,Y最大的肯定符合题意,从对列取出扔到一个vector里。然后依次从队列取出点,当且仅当横坐标大于vector中末尾一个点的横坐标时满足要求,然后将这个点扔到vector里。最后vector按照横坐标排序输出。总共nlgn复杂度,不过还是只过了50报超时……
点赞 回复 分享
发布于 2017-08-23 04:16
贪心算法的活动安排问题
点赞 回复 分享
发布于 2017-08-23 08:43
思路基本一样,50%过的,到现在没有见到一个兄弟100%的,你后面两道题做的怎么样啊
点赞 回复 分享
发布于 2017-08-23 09:07

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务