码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 非负数组中两个数相与的最大结果


    文章目录

    • 题目
    • 一、解题思路
      • 解题步骤
    • 代码


    题目

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

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

    一、解题思路

    可以用前缀树,额外空间比较大,
    存在更好的解法思路:高位尽量变1因为我如果选一些数让30位变成0,它就不如30位变成1的值大。
    先遍历一遍所有的数字,只考察30位是1的有几个,分情况
    在这里插入图片描述

    1)小于两个
    这说明最终的结果30位上肯定不是1,因为你小于两个就不存在任何两个数与完之后第30位是1
    2)正好有两个数,就是这两个数与完的结果最大,直接返回就行
    在这里插入图片描述
    3)大于两个数
    那我就把这100个数淘汰掉,剩下的我只留这23个数,我再去看第29位

    解题步骤

    第i位上有1的数:

    1. <2个
    2. =2个
      3)>2个
      我们遍历一遍整个数组,如果有第i位上有1的数,第1种情况小于两个,那么这20个数一个也不淘汰,你接下来去看i-i位。
      第2种情况如果这20个数中第1位上1的只有两个数,你不用再看,直接返回
      第3种情况如果在第i位上有1的数是大于两个的,比如说他有7个,删掉剩余的13个,只留这7个数去搞下一位

    我们设置一个垃圾区,即淘汰的数,
    在这里插入图片描述
    如果是第三种情况,在遍历数组中,只用遍历垃圾区前的数就行了

    代码

    	public static int maxAndValue2(int[] arr) {
    		// arr[0...M-1]  arr[M....]
    		int M = arr.length;
    		int ans = 0;
    		for (int bit = 30; bit >= 0; bit--) {
    			// arr[0...M-1] arr[M...]
    			int i = 0;
    			int tmp = M;
    			while (i < M) { //遍历垃圾区前的数
    				//如果i位为1,与垃圾区前一个数交换,垃圾区往左扩
    				if ((arr[i] & (1 << bit)) == 0) {
    					swap(arr, i, --M);
    				} else {
    					i++;
    				}
    			}
    			if (M == 2) { 
    				return arr[0] & arr[1];
    			}
    			if (M < 2) {
    				M = tmp;
    			} else { //m>2的情况
    				ans |= (1 << bit);
    			}
    		}
    		return ans;
    	}
    
    	public static void swap(int[] arr, int i, int j) {
    		int tmp = arr[i];
    		arr[i] = arr[j];
    		arr[j] = tmp;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    Python学习笔记
    Type-C接口相关知识
    工作之余happy一下(编写一个带两个变量和一个运算符的四则运算函数)
    结构体、枚举、位段、联合体详解
    官宣!Sam Altman加入微软,OpenAI临时CEO曝光,回顾董事会‘’政变‘’始末
    Vue 官方文档2.x教程学习笔记 1 基础 1.2 介绍 1.2.5 处理用户输入 & 1.2.6 组件化应用构建 & 1.2.7 与自定义元素的关系
    快手视频批量下载.py(10月可以用)
    Linux驱动之INPUT子系统框架
    Tuna: Instruction Tuning using Feedback from Large Language Models
    Ranger配置图片及json文件预览
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/125837243
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号