平方之后的结果数

简介: 平方之后的结果数

题目

给定一个有序数组arr,其中值可能为正、负、0
返回arr中每个数都平方之后不同的结果有多少种?

一.哈希表

遍历每一个数,如果有不同的,就放入哈希表里
如果哈希表内有的话就跳过

    public static int diff1(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        HashSet<Integer> set = new HashSet<>();
        for (int cur : arr) {
            set.add(cur * cur);
        }
        return set.size();
    }

二、双指针

对于比较不同,并且数组是有序的,可以考虑使用双指针
左指针从头出发,右指针从尾部出发
比较两个指针的绝对值,如果不相等,那就记录
绝对值大的指针往中间滑,如果旁边的数与指针的数相等,那就继续滑,直到遇到不相等的数
如果两个指针的绝对值都相等,那就两个指针一起滑,直到遇到不同的数

代码

    public static int diff2(int[] arr) {
        int N = arr.length;
        int L = 0;
        int R = N - 1;
        int count = 0;
        int leftAbs = 0;
        int rightAbs = 0;
        while (L <= R) {
            count++;
            leftAbs = Math.abs(arr[L]);
            rightAbs = Math.abs(arr[R]);
            if (leftAbs < rightAbs) {
                while (R >= 0 && Math.abs(arr[R]) == rightAbs) {
                    R--;
                }
            } else if (leftAbs > rightAbs) {
                while (L < N && Math.abs(arr[L]) == leftAbs) {
                    L++;
                }
            } else {
                while (L < N && Math.abs(arr[L]) == leftAbs) {
                    L++;
                }
                while (R >= 0 && Math.abs(arr[R]) == rightAbs) {
                    R--;
                }
            }
        }
        return count;
    }

总结

遇到数组找出有多少个不同的数的问题,可以考虑使用双指针法,可以设置两个指针
左指针在头节点出发,右指针从尾出发

相关文章
|
6月前
|
算法
给定两个数,求这两个数的最大公约数
给定两个数,求这两个数的最大公约数
|
2月前
|
机器学习/深度学习 网络协议 Windows
几个数相加
几个数相加。
50 4
|
4月前
|
算法 Java
求多个数的最大公约数及比例化简
求多个数的最大公约数及比例化简
36 1
|
6月前
求十个数的乘积
求十个数的乘积
33 0
|
算法
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
|
自然语言处理 算法 Python
利用函数求出一个数组最大三个数的乘积
利用函数求出一个数组最大三个数的乘积
119 0
|
算法
找出三个最大值求乘积
找出三个最大值求乘积
84 0
h0039. 平方数 (15 分)
h0039. 平方数 (15 分)
132 0
统计正数和负数的个数然后计算这些数的平均值(循环、数组解法)
统计正数和负数的个数然后计算这些数的平均值(循环、数组解法)
207 0