LintCode 844: Number Pair Statistics

本文探讨了如何在给定点集上寻找所有可能的点对,这些点对的x坐标和y坐标的和都能被2整除。通过将点分为四类:奇数x奇数y、奇数x偶数y、偶数x奇数y和偶数x偶数y,我们提出了一种高效的算法来解决这个问题。

844. Number Pair Statistics

Given a List <Point> p, find the number of (i,j) pairs that satisfy both p[i].x + p[j].x and p[i].y + p[j].y(i < j) can be divisible by 2.

Example

Example1

Input: p = [[1,2],[3,4],[5,6]]
Output: 3
Explanation:
p[0],p[1],p[2] Pairwise Covering, the sum of their x and y can be divided by 2

Example2

Input: p = [[0,3],[1,1],[3,4],[5,6]]
Output: 1
Explanation:
Only when p [2] and p [3] are combined, their sum of x and y can be divided by two.

Notice

  • The length of given list len <= 10000.

Input test data (one parameter per line)How to understand a testcase?

解法1:

这题其实是数学题。找出oddXoddY,  oddXevenY, evenXoddY, evenXevenY这4个集合各有多少个元素,符合条件的解必然是这4个集合内部两两匹配。

class Solution {
public:
    /**
     * @param p: the point List
     * @return: the numbers of pairs which meet the requirements
     */
    int pairNumbers(vector<Point> &p) {
        int n = p.size();
        int oddXoddY = 0, oddXevenY = 0, evenXoddY = 0, evenXevenY = 0;

        for (int i = 0; i < n; ++i) {
            if (p[i].x & 0x1) {
                if (p[i].y & 0x1) {
                    oddXoddY++;
                } else {
                    oddXevenY++;
                }
            } else {
                if (p[i].y & 0x1) {
                    evenXoddY++;
                } else {
                    evenXevenY++;
                }
            }
        }

        int result = 0;
        
        result = oddXoddY * (oddXoddY - 1) / 2 +
                 evenXevenY * (evenXevenY - 1) / 2 +
                 oddXevenY * (oddXevenY - 1) / 2 +
                 evenXoddY * (evenXoddY - 1) / 2;

        return result;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值