题目描述

给定一个非负数组成的数组,长度一定大于1
想知道数组中哪两个数&的结果最大

返回这个最大结果

时间复杂度O(N),额外空间复杂度O(1)

题目解析

分析

  • 这里可以用前缀树来实现,但是要求额外空间复杂度O(1)

思路

  • 一个int来说可以写成一个31位的二进制数
  • 贪心:

    • 从30位开始尽量让高位变1(因为是非负整数,所以不用考虑符号位)
    • 因为如果选一些数让30位变成0,它就不如让30位变成0的值大

步骤

  • 先遍历一遍所有的数字,只考察第30位是1的有几个,分情况

    • 1)<=1个,说明第30位肯定不是1(1&0=0,0&0=0),所以这些数一个也不淘汰
    • 2)刚好2个,就是这两个数相与最大,直接返回即可
    • 3)大于2个。比如如果有23个数第30位是1,那么淘汰剩下的那些数,只保留这23个数
  • 接着遍历这32个数,只考察第29位是1的有几个…

时间复杂度:考虑最难的情况,假如每次都不淘汰数字,那么一个需要遍历32次个N,因此时间复杂度是O(32N)

因为空间复杂度要求O(1),所以我们应该在原数组上操作。

  • 那应该怎么淘汰数组呢?在最右边维护一个垃圾区
  • 如果发现某个数应该被淘汰,那么就将它交换到右边去

实现

// 时间复杂度O(N)
int maxAndValue(std::vector<int>  arr){int M = arr.size();int ans = 0;for (int bit = 30; bit >= 0; --bit) {int tmp = M; //还剩下M个数int i = 0;while (i < M){ // arr[0...M-1]if((arr[i] & (1 << bit)) == 0){std::swap(arr[i], arr[--M]);//需要淘汰}else{i++;}}//还剩下M个数if(M == 2){return arr[0] & arr[1];}if(M < 2){//不淘汰M = tmp;}else{ // > 2个数  bit位上有1ans |= (1 << bit);}}return ans;
}

对数器

// O(N^2)的暴力解
int maxAndValue_test(std::vector<int>  arr){int M = arr.size();int max = INT32_MIN;for (int i = 0; i < M; ++i) {for (int j = i + 1; j < M; ++j) {max = std::max(max, arr[i] & arr[j]);}}return max;
}std::default_random_engine e;
std::vector<int>  generateRandom(int maxLen, int minValue, int maxValue){std::uniform_int_distribution<int> distS(2, maxLen);std::uniform_int_distribution<int> distV(minValue, maxValue);std::vector<int> arr;int size = distS(e);arr.resize(size);for (int i = 0; i < size; ++i) {arr[i] = distV(e);}return arr;
}
int showbit2(int a){int ret = 0;while(a){ret = ret*10 + (a % 2);a = a / 2;}return ret;
}
template<typename T>
void display(std::vector<T>& vec) {for (auto it: vec) {std::cout << it  << "("<< showbit2(it) << "),";}std::cout << "\n";
}
int main() {e.seed(time(NULL));int testCount(100);    // epochint maxSize(1000);    // max size of the vectorint minValue(0);int maxValue(1000);     // maxvaluefor (int i = 0; i < testCount; ++i) {std::vector<int> vec1 = generateRandom(maxSize,  minValue, maxValue);int ans1 = maxAndValue_test(vec1);int ans2 = maxAndValue(vec1);if(ans1 != ans2){printf("error!  right : %d, but : %d. test arr:\n", ans1, ans2);display(vec1);return 0;}}printf("finish!");return 0;
}

算法:非负数组中两个数相与的最大结果相关推荐

  1. 非负数组中两个数相与的最大结果

    文章目录 题目 一.解题思路 解题步骤 代码 题目 给定一个非负数组成的数组,长度一定大于1 想知道数组中哪两个数&的结果最大 返回这个最大结果 时间复杂度O(N),额外空间复杂度O(1) 一 ...

  2. leetcode算法题--数组中两个数的最大异或值

    原题链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 1.方法一:暴力法 func findMax ...

  3. arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」

    今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值.在 异或 这个知识点里面属于一个中高难度的题目. 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, ...

  4. 两种方法求解 正数数组中 两个数相减 的最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标. 即求出: maxValue = max{arr[j]-arr[i] ...

  5. Leetcode :421. 数组中两个数的最大异或值 (位运算)

    421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ...

  6. 数组中两个数的最大异或值 两数异或值一定小于两数相加和

    链接:数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间 ...

  7. LeetCode 421. 数组中两个数的最大异或值

    421. 数组中两个数的最大异或值 Idea 假设选择了数组中的元素ai和aj使得它们达到最大按位异或结果x:x=ai⊕ajx=a_{i}⊕a_{j}x=ai​⊕aj​,其中⊕表示按位异或运算. 根据 ...

  8. 421. 数组中两个数的最大异或值

    题目:421. 数组中两个数的最大异或值 题解:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/solu ...

  9. leetcode421. 数组中两个数的最大异或值(贪心算法)

    给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间解决这个问题吗? 示例 1: 输 ...

最新文章

  1. python答题系统的代码_Python考试系统自动答题(教务处)
  2. 安装最新Spree出现error:spree_core requires will_paginate (= 3.0.pre2, runtime)
  3. 数据库的binlog、redolog以及undolog
  4. hspice2016安装教程
  5. jakarta ee_Jakarta EE 8状态
  6. kafka 常见问题( 持续更新... ... )
  7. php取整数余数,js取整数、取余数的方法
  8. HTTP和HTTPS的区别是什么?
  9. 二叉树的前中后序遍历的非递归形式【Java】
  10. 电商平台拼多多详情接口API数据获取示例
  11. 炒外汇APP平台哪个好,排名前十的炒外汇平台
  12. Hexo博客美化之蝴蝶(butterfly)主题魔改
  13. 应广单片机 PMS150G、FPC161 基础例子【PWM设置】
  14. 厦门大学计算机考研复试线2021,2021浙江大学、中科大、厦门大学考研复试分数线公布!...
  15. 系统集成项目经理申报
  16. Ubuntu 部署 Flask + WSGI + Nginx 详解
  17. Beego 简单用户注册与登录
  18. nginx 开机启动报错An error occurred.
  19. python判断三边是否构成三角形并求面积_Python 计算三角形的面积
  20. The Frame Buffer

热门文章

  1. 【C语言】(用函数实现)请给小学生随机出10道加减法的练习题,要求:10以内的加减法,并且能批改。
  2. java仓库管理系统sql_仓库管理系统 java+sql server
  3. 解决ubuntu18.04下ibus-libpinyin 拼音无法选择除第一个的候选词问题以及中英文切换问题
  4. 迪士尼和李宁合作推出“李宁复古运动米奇系列”服饰
  5. 关于大疆无人机Phantom的一些问题
  6. 动态规划(4)滑雪问题
  7. 【深度学习】卷积概念以及卷积核层数
  8. 程序人生 - 过来人经验:程序员怎么升职加薪,迎娶白富美
  9. java超市收银系统mysql,java课程设计(含数据库代码)
  10. Matlab基础——变量和语句