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; }
  • 相关阅读:
    Silverlight 中使用不同面板进行布局的效果比较
    将PDF格式文件添加到iPhone4手机 iBooks程序中.
    [转]学习WPF参考书
    [转]OEM版XP SP3安装时提示“序列号无效”的解决方法
    关于系统响应函数OnSysCommand
    为何在自定义消息处理函数中无法利用wParam或lParam传递指针?
    自定义消息(上)
    VC++中单选与复选按钮的使用
    VC++ Combo Box/Combo Box Ex控件
    VC++中的ON_COMMAND_RANGE宏
  • 原文地址:https://www.cnblogs.com/cocos2014/p/4630919.html
Copyright © 2011-2022 走看看