找到集合 P 中的所有 ”最大“ 点的集合

摘要:
标题描述P是给定的二维平面整数点集。定义P中的点x。如果x满足P中的任何点不在x的右上区域,则称为“最大值”。找到所有“最大”点的集合。

题目描述

P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

找到集合 P 中的所有 ”最大“ 点的集合第1张

例子:

input:

5
1 2
5 3
4 6
7 5
9 0

output:

4 6
7 5
9 0

代码实现

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

class MaxPointDraw:
    def __init__(self):
        self.xy = []
        self.max_x = 0
        self.max_y = 0

    def generateCoordinateCollection(self):
        number = int(input('please input a number(1 <= number <= 10000):'))
        for i in range(number):
            input_xy = input()
            x = int(input_xy.split(' ')[0])
            y = int(input_xy.split(' ')[1])
            if x > self.max_x:
                self.max_x = x
            if y > self.max_y:
                self.max_y = y
            self.xy.append([x, y])

    def checkIsMaxPoint(self, xy_args):
        x = xy_args[0]
        y = xy_args[1]
        for xy_list in self.xy:
            x_value = xy_list[0]
            y_value = xy_list[1]
            if x_value > x and y_value > y:
                return False
        return True
    
    def Output(self):
        print('--------------------')
        for xy_list in self.xy:
            x_value = xy_list[0]
            y_value = xy_list[1]
            if self.checkIsMaxPoint(xy_list):
                print(' '.join(['%s'%xy for xy in xy_list]))

if __name__ == "__main__":
    mpd = MaxPointDraw()
    mpd.generateCoordinateCollection()
    mpd.Output()

输出:

please input a number(1 <= number <= 10000):5
1 2
5 3
4 6
7 5
9 0
--------------------
4 6
7 5
9 0

拓展

使用matplotlib来展示效果,以及随机生成一个点集合:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from random import randint
import matplotlib.pyplot as plt


class MaxPointDraw:
    def __init__(self):
        self.xy = []
        self.max_x = 0
        self.max_y = 0
    # generate CoordinateCollection
    def generateCoordinateCollection(self):
        number = int(input('please input a number(1 <= number <= 10000):'))
        for i in range(number):
            x = randint(0, number)
            y = randint(0, number)
            if x > self.max_x:
                self.max_x = x
            if y > self.max_y:
                self.max_y = y
            self.xy.append([x, y])

    # check the point is Max or not
    def checkIsMaxPoint(self, xy_args):
        x = xy_args[0]
        y = xy_args[1]
        for xy_list in self.xy:
            x_value = xy_list[0]
            y_value = xy_list[1]
            if x_value > x and y_value > y:
                return False
        return True
    # show the MaxPoint result
    def DrawPaint(self):
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.set(xlim=[0, self.max_x+self.max_x//2], ylim=[0, self.max_y+self.max_y//2], title='Max Point Set',
               ylabel='Y-Axis', xlabel='X-Axis')
        for xy_list in self.xy:
            x_value = xy_list[0]
            y_value = xy_list[1]
            if self.checkIsMaxPoint(xy_list):
                plt.scatter([x_value], [y_value], color='red')
            else:
                plt.scatter([x_value], [y_value], color='blue')
        plt.show()


if __name__ == "__main__":
    mpd = MaxPointDraw()
    mpd.generateCoordinateCollection()
    mpd.DrawPaint()

input1:

please input a number(1 <= number <= 10000):10

result1:

找到集合 P 中的所有 ”最大“ 点的集合第2张

input2:

please input a number(1 <= number <= 10000):50

output2:

找到集合 P 中的所有 ”最大“ 点的集合第3张

效果就是上面的样子,复制代码后运行前需要pip install matplotlib 不然会找不到这个包。

免责声明:文章转载自《找到集合 P 中的所有 ”最大“ 点的集合》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【RabbitMQ】一文带你搞定springboot整合RabbitMQ涉及消息的发送确认,消息的消费确认机制,延时队列的实现vue拖拽建站的简单模式vue-grid-layout下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

chrome表单自动填充导致input文本框背景变成偏黄色问题解决

chrome表单自动填充后,input文本框的背景会变成偏黄色的,想必大家都会碰到这种情况吧,这是由于chrome会默认给自动填充的input表单加上input:-webkit-autofill私有属性造成的,解决方法如下,感兴趣的朋友可以了解下 chrome表单自动填充后,input文本框的背景会变成偏黄色的,这是由于chrome会默认给自动填充的inp...

Oracle加密解密

Oracle内部有专门的加密包,可以很方便的对内部数据进行加密(encrypt)和解密(decrypt).   介绍加密包之前,先简单说一下Oracle基本数据类型——RAW类型。   RAW,用于保存位串的数据类型,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。      操作RAW类...

C++篇实现MD5算法

1、头文件 #ifndef MD5_H  #define MD5_H  #include <string>  #include <fstream>  /* Type define */  typedef unsigned char byte;  typedef unsigned int uint32;  using std::st...

细说 Form (表单)

细说 Form (表单) 阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Ajax方式提交整个表单 以Ajax方式提交部分表单 使用JQuery,就不要再拼URL了! id, name 有什么关系 使用C#...

logstash之input、codec学习

Logstash最强大的功能在于丰富的过滤器插件。此过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理。甚至添加独特的事件到后续流程中。 1、logstash基本语法组成 logstash主要由三部分组成:input、filter、output。而filter就是过滤器插件,这个组件可以不要,但是这样子就不能体现出logtas...

layui 解决浏览器自动填充form表单账号和密码输入框的问题

用js去清除input的value值是无效的,因为浏览器填充账号密码的动作是在js执行完之后发生的。 浏览器会自动寻找第一个输入框和最后一个密码框自动填充,我们可以给它添加一些假的密码框,让其无法自动填充。 解决办法: 在自己的input框前后添加假的<input type="password" /> <input type="pass...