平方之后的结果数

简介: 平方之后的结果数

题目

给定一个有序数组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;
    }

总结

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

相关文章
|
1月前
leetcode-2006:差的绝对值为 K 的数对数目
leetcode-2006:差的绝对值为 K 的数对数目
53 0
|
1月前
|
人工智能
PTA-求一组数中大于平均值的数的和
求一组数中大于平均值的数的和
36 0
|
1月前
leetcode-6118:最小差值平方和
leetcode-6118:最小差值平方和
24 0
|
1月前
leetcode-1984:学生分数的最小差值
leetcode-1984:学生分数的最小差值
28 0
|
1月前
求十个数的乘积
求十个数的乘积
20 0
|
11月前
|
算法
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
|
算法
找出三个最大值求乘积
找出三个最大值求乘积
62 0
|
自然语言处理 算法 Python
利用函数求出一个数组最大三个数的乘积
利用函数求出一个数组最大三个数的乘积
96 0
|
Python
LeetCode 2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
83 0
LeetCode 5854. 学生分数的最小差值
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
72 0