【LeetCode:3133】数组最后一个元素的最小值(Java)
题目链接
- 3133. 数组最后一个元素的最小值
题目描述
给你两个整数 n 和 x 。你需要构造一个长度为 n 的 正整数 数组 nums ,对于所有 0 <= i < n - 1 ,满足 nums[i + 1] 大于 nums[i] ,并且数组 nums 中所有元素的按位 AND 运算结果为 x 。
返回 nums[n - 1] 可能的 最小 值。
示例 1:
输入:n = 3, x = 4
输出:6
解释:
数组 nums 可以是 [4,5,6] ,最后一个元素为 6 。
示例 2:
输入:n = 2, x = 7
输出:15
解释:
数组 nums 可以是 [7,15] ,最后一个元素为 15 。
提示:
1 <= n, x <= 108
求解思路
- 数组中各项的值按
&
运算最后得到x
,由于&
运算两项都为1结果才是1,因此可以得出:数组nums
中每一项的二进制位都包含x
的二进制位(即x
二进制位中取1的位置,任一数组元素在该位置都会取1)。 - 因为数组
nums
递增,我们可以在x
的二进制位为0的位置依次填入数字。例如第0项可以不做填入,第1项在最低为填入1。 - 要找数组第
n-1
项的最小值,就相当于在x
的0位置上填入n-1
(如果0的位数不够就在前面补0)。 i
表示x
二进制表示的第i
位,j
表示n-1
二进制表示的第j
位。while
循环直到把n-1
全部填入为止。如果x
的第i
位为0,则将n-1
的第j
位填入。
实现代码
class Solution {public long minEnd(int n, int x) {--n; //填入的数值为n-1long ans = x;int i = 0, j = 0;while ((n >> j) > 0) {// 如果x的第i位是0if ((ans >> i & 1) == 0) {// 将n-1的第j位填入ans |= (long) (n >> j & 1) << i;j ++;}i ++;}return ans;}
}