在数组中查找出现奇数次的元素

原文地址:Find the Number Occurring Odd Number of Times

已知一个整数数组,除了一个元素只出现了奇数次,其他元素均出现偶数次。在O(n)的时间与常量空间范围内找出这个数字。

例如
I/P = [1, 2, 3, 2, 3, 1, 3]
O/P = 3

一个简单地办法就是两层循环。外部循环逐一选择元素,内部循环计数被选择的元素出现的次数。这个方法的实践复杂度是 O(n2)

更好一点的方法用哈希法。利用数组元素作为key,元素出现的次数作为value。建立一个空的哈希表,逐一遍历已知数组中的元素,并保存出现的次数。这个方法的实践复杂度是O(n),但是它需要额外的空间用于哈希。

最好的方法就是用XOR对所有的元素作位操作。所以元素做XOR操作可以得到出现奇数次的元素。请注意如果两个元素相同,那么这两个元素的XOR的结果是0,x与0的XOR的结果是x。

下面就是最佳方法的实现:

//Java program to find the element occurring odd number of times

class OddOccurance 
{
    int getOddOccurrence(int ar[], int ar_size) 
    {
        int i;
        int res = 0;
        for (i = 0; i < ar_size; i++) 
        {
            res = res ^ ar[i];
        }
        return res;
    }

    public static void main(String[] args) 
    {
        OddOccurance occur = new OddOccurance();
        int ar[] = new int[]{2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2};
        int n = ar.length;
        System.out.println(occur.getOddOccurrence(ar, n));
    }
}

输出:

5

时间复杂度:O(n)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 分治法选择数组的第k小元素的步骤如下: 1. 在数组选择一个基准元素。 2. 将数组划分为小于基准元素、等于基准元素和大于基准元素的三个部分。 3. 如果第k小元素在小于基准元素的部分,则在这部分递归地查找第k小元素。 4. 如果第k小元素在等于基准元素的部分,则直接返回基准元素。 5. 如果第k小元素在大于基准元素的部分,则在这部分递归地查找第k-m小元素,其m是等于基准元素的数量加上小于基准元素的数量。 ### 回答2: 分治法选择数组的第k小元素的算法步骤如下: 1. 将原始数组划分为长度相等的子数组,直到每个子数组只包含一个元素。 2. 对每个子数组进行排序。 3. 从每个排序后的子数组选择位数(即元素个数为数时,选取间的元素元素个数为偶数时,选取间两个元素的平均值)。 4. 将这些位数构成一个新的数组作为位数数组。 5. 递归地调用该算法,将位数数组作为新的原始数组进行处理,直到位数数组只包含一个元素。 6. 找到位数数组的第k小元素,即为原始数组的第k小元素。 这个算法基本上是利用了分治法的思想。通过对原始数组进行划分,将大的问题分解为小的子问题,并将子问题的结果进行合并,在每一次划分和合并的过程,选取合适的元素进行排序和选择,最终得到原始数组的第k小元素。算法的时间复杂度为O(nlogn),其n为原始数组的长度,因为每一次划分和合并都需要进行数组的排序和复制操作。 ### 回答3: 分治法选择数组的第k小元素的算法步骤如下: 1. 将给定的数组分成若干个子数组。 2. 对每个子数组进行递归地找到其位数。 3. 将这些数组成一个新的数组,称为位数数组。 4. 对位数数组进行递归地找到其位数,即位数数组位数。 5. 将位数数组位数作为枢纽(pivot)。 6. 根据枢纽将原始数组划分为三个部分,小于枢纽的元素、等于枢纽的元素和大于枢纽的元素。 7. 根据k与三个部分的大小关系,决定继续在哪个部分继续查找第k小元素。 - 如果k小于等于小于枢纽的元素的数量,则在小于枢纽的部分继续查找第k小元素。 - 如果k大于小于枢纽的元素的数量且小于等于小于枢纽加等于枢纽的元素的数量,则返回枢纽作为第k小元素。 - 如果k大于小于枢纽加等于枢纽的元素的数量,则在大于枢纽的部分继续查找第k小元素。 8. 重复递归进行上述步骤,直到找到第k小元素。 这个算法的关键在于每次选择合适的枢纽,以尽量均匀地划分数组,从而使得每次递归的规模下降得快。平均时间复杂度为O(n),最坏情况下的时间复杂度为O(n^2),其n为数组的长度。这个算法在时间复杂度上比简单的排序算法如冒泡排序和插入排序更优秀,适合用于需要找到数组第k小元素的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值