【leetcode详解】数组最后一个元素的最小值(位运算典例)

 

思路分析

为便于叙述,下记:

  • A: x的二进制
  • B: x的二进制中非1的位置

由AND运算特点可知:

nums数组中的元素满足:如果 在某一位上为1,则nums中元素对应二进制在该位上也必须是1

换言之,从二进制码的视角看nums中元素,他们的二进制相当于以 为基础,在 上做了些调整

又因nums中元素互异且最小

  • nums中最小值nums[0]就是x本身(将 中所有位置置于0
  • nums中最小值nums[n-1]就是将 中所有位置依次填上n-1的二进制的每一位

所以嗦,要计算返回的结果就是

        先计算x的二进制码,再计算n-1的二进制码,最后将后者依次填进前者的0位上,得到的“杂交二进制”所对应的整数就是结果。


以下附上代码 & 笔者基于自身理解给出的注释:

class Solution {
public:
    long long minEnd(int n, int x) {
		//通过对x取反得到t,
        //通过计算t的lowbit来从低到高位遍历t的1位,即x的0位
		n-=1;
		int j=0;
		long long t = ~x;		
		long long ans = x;
        //注意:n>>j 和 n>>j & 1的判断条件并不等价!
		while(n >> j)
		{
			int lb = t & -t;
			//计算t的lowbit
			ans |= (long long)((n>>j & 1) << j) * lb;
			//通过乘法运算巧妙实现了if语句的功能
			j++;
			t ^= lb;
			//更新t,将lb为1那位t值变成0
		}
		return ans;
    }
};

题解参考,膜拜灵神!

3133. 数组最后一个元素的最小值 - 力扣(LeetCode)

~希望对你有启发~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值