热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

非负数组中两个数相与的最大结果:互为倒数的两个数加起来的最小值

本文主要介绍关于算法,数据结构,排序算法的知识点,对【非负数组中两个数相与的最大结果】和【互为倒数的两个数加起来的最小值】有兴趣的朋友可以看下由【小卢要刷力扣题】投稿的技术文章,希望该技术和经验能帮到

本文主要介绍关于算法,数据结构,排序算法的知识点,对【非负数组中两个数相与的最大结果】和【互为倒数的两个数加起来的最小值】有兴趣的朋友可以看下由【小卢要刷力扣题】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的相关技术问题。

互为倒数的两个数加起来的最小值

文章目录 题目一、解题思路解题步骤 代码


题目

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

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

一、解题思路

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

非负数组中两个数相与的最大结果:互为倒数的两个数加起来的最小值

1)小于两个
这说明最终的结果30位上肯定不是1,因为你小于两个就不存在任何两个数与完之后第30位是1
2)正好有两个数,就是这两个数与完的结果最大,直接返回就行

非负数组中两个数相与的最大结果:互为倒数的两个数加起来的最小值


3)大于两个数
那我就把这100个数淘汰掉,剩下的我只留这23个数,我再去看第29位

解题步骤

第i位上有1的数:

<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;
	}

本文《非负数组中两个数相与的最大结果》版权归小卢要刷力扣题所有,引用非负数组中两个数相与的最大结果需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
author-avatar
方家菱芝合
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有