[M位运算] lc3133. 数组最后一个元素的最小值(位运算+思维+好题)

2024-08-23 08:52

本文主要是介绍[M位运算] lc3133. 数组最后一个元素的最小值(位运算+思维+好题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:3133. 数组最后一个元素的最小值

题单位置:

    1. 位运算(基础/性质/拆位/试填/恒等式/思维)
    • 二、与或(AND/OR)的性质

2. 题目解析

一道挺有意思的题目。位运算的简单拓展。

主要讲下简单的代码实现方法和思路:

  • 相当于 x 的二进制表示下,0 的位置相当于一个个的空位置,都是待填的空位置。想象一下把这些空位置拿出来放一起,构成一个二进制表示。这个二进制表示下的数,也就唯一对应了这些空位值填 0 、填 1。并且恰好,将二进制数所对应的 10 进制数记为 t,就等价于满足题目要求的第 t 个数,因为我们是从低位到高位有序填写的。那么如果我们要填 n 个数,那就相当于 n 的二进制表示。将它填到 x 的这些空位值上即可。

注意位运算这里,也可能会爆 LL。


踩坑:

  • 一开始想到了只需要关注 x 的 0 位置即可。
  • 然后每个 0 位置的贡献值相当于 2 的倍数。1、2、4、8、16…
  • 然后假设有 x 个 0,那么相当于有 1<< x 种填写情况。
  • 那么只需要枚举到该情况即可。
  • 然后写完 TLE 几次才发现,这不就是 n 的二进制表示填到 x 的空位上吗…淦。

  • 时间复杂度 O ( log ⁡ n + log ⁡ x ) O(\log n + \log x) O(logn+logx)
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:typedef long long LL;long long minEnd(int n, int x) {LL res = x;n -- ;int i = 0, j = 0;   // x 的第 i 位,n 的第 j 位while (n >> j) {if ((res >> i & 1) == 0) {  // j 的每一位填充到 x 的每一个 0 位res |= (LL)(n >> j & 1) << i;j ++ ;}i ++ ;}return res;}
};

这篇关于[M位运算] lc3133. 数组最后一个元素的最小值(位运算+思维+好题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098920

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图