zoukankan      html  css  js  c++  java
  • 逻辑运算符在减少时间复杂度上的使用

    以下两个题目来源于Leetcode:

    1.Single number

    Given an array of integers, every element appears twice except for one. Find that single one.
    Note: Your algorithm should have a linear runtime complexity. Could you implement it without using
    extra memory?

    一般的思路是取数组中的每一个数进行遍历,如果能找到则不是,如果找不到相同的数说明找到该单个值。很显然时间复杂度为O(n^n),题目要求时间复杂度为线性的,此种方法行不通,如何做到对数组只遍历一次即可找到结果?方法是采用逻辑运算符实现。

    原理是a^b=b^a;a^0=a;a^a=0。这样以来只需要把数组里的每一个进行异或得到的结果就是出现单次的那个值,同样该方法还适合于出现奇数次的值的查询,因为相同的数出现偶次后异或的结果是0,出现奇数次的数最后的形式就是0^a=a,a就是那个出现奇数次的那个数,代码如下:

    class Solution {
    public:
    int singleNumber(int A[], int n) {
    int x = A[0];
    for (size_t i = 1; i < n; ++i)
    x ^= A[i];
    return x;
    }
    };

    2.Given an array of integers, every element appears three times except for one. Find that single one.
    Note: Your algorithm should have a linear runtime complexity. Could you implement it without using
    extra memory?

    这里一个数出现1次,其他的数出现3次,无法使用上述方法,解题思路是对每一位进行计数,如果一个数出现3次,则该位对应的值模3结果为0,否则出现一次的模3结果为其本身,这样即可得出结果,代码如下:

    class Solution { 
    public:

    int
    singleNumber(int A[],int n) { int bitArray[32] = {0}; int res = 0; for(int i = 0;i < 32;i++) { for(int j = 0;j < n;j++) { bitArray[i] += (A[j]>>i)&1; } res |= (bitArray[i]%3)<<i; } return res; }
  • 相关阅读:
    PLAYBOOK 命令统计资源利用率 输出本地文件 flask展示
    如何对PFX证书转换成PEM格式证书
    Openshift学习
    Playbook handlers使用
    网络空间安全基础篇(2)----wireshark
    网络空间安全基础篇(1)----nmap的使用
    opencv——图像掩码操作
    opencv图像阈值操作
    在图片上绘制图形和添加文字
    使用opencv去操作树莓派摄像头保存图片和视频
  • 原文地址:https://www.cnblogs.com/cocos2014/p/4630919.html
Copyright © 2011-2022 走看看