新闻详情

新闻详情

首页 / 资讯中心 / 详情

DeepSeek LeetCode 3171. 找到按位或最接近 K 的子数组 C语言实现

发布时间:2026/9/16 7:31:52来源:尧图网络
DeepSeek    LeetCode 3171. 找到按位或最接近 K 的子数组 C语言实现
以下是 LeetCode 3171 的 C 语言实现。C 语言需要手动管理动态数组核心思路与 Java 版本完全一致维护以当前元素结尾的所有不同或值。c#include stdio.h#include stdlib.h#include limits.h// 存储 (orValue, leftIndex)typedef struct {int orValue;int leftIdx;} Pair;int minimumDifference(int* nums, int numsSize, int k) {// prev 存储上一个右端点产生的不同或值Pair* prev (Pair*)malloc(numsSize * sizeof(Pair));int prevSize 0;int ans INT_MAX;for (int i 0; i numsSize; i) {// cur 存储当前右端点产生的不同或值Pair* cur (Pair*)malloc(numsSize * sizeof(Pair));int curSize 0;// 当前元素单独成为一个子数组cur[curSize].orValue nums[i];cur[curSize].leftIdx i;curSize;// 合并之前的或值for (int j 0; j prevSize; j) {int newVal prev[j].orValue | nums[i];// 去重只保留不同的 orValueif (cur[curSize - 1].orValue ! newVal) {cur[curSize].orValue newVal;cur[curSize].leftIdx prev[j].leftIdx;curSize;}}// 更新答案for (int j 0; j curSize; j) {int diff abs(cur[j].orValue - k);if (diff ans) {ans diff;}}// 释放 prev 并更新为 curfree(prev);prev cur;prevSize curSize;}free(prev);return ans;}内存优化版本避免频繁 malloc频繁的 malloc/free 会影响性能。可以预分配两个二维数组交替使用cint minimumDifference(int* nums, int numsSize, int k) {// 每个右端点最多产生 32 种不同或值int 型 31 个有效位int prevVals[32], prevLefts[32];int prevSize 0;int curVals[32], curLefts[32];int ans INT_MAX;for (int i 0; i numsSize; i) {int curSize 0;// 当前元素单独成为子数组curVals[curSize] nums[i];curLefts[curSize] i;curSize;// 合并 prev 中的或值for (int j 0; j prevSize; j) {int newVal prevVals[j] | nums[i];if (curVals[curSize - 1] ! newVal) {curVals[curSize] newVal;curLefts[curSize] prevLefts[j];curSize;}}// 更新答案for (int j 0; j curSize; j) {int diff abs(curVals[j] - k);if (diff ans) ans diff;}// 交换 cur 和 prev为下一轮准备// 方式1直接复制数组prevSize curSize;for (int j 0; j curSize; j) {prevVals[j] curVals[j];prevLefts[j] curLefts[j];}}return ans;}核心要点说明特性 说明时间复杂度 O(n·logU)U max(nums) ≤ 2×10⁹logU ≤ 31空间复杂度 O(logU)使用固定大小 32 的数组去重条件 curVals[curSize-1] ! newVal确保只保留不同的 or 值leftIdx 作用 虽然这里没用于剪枝但保留它可用于其他扩展需求如求最小区间长度示例验证c// 测试代码#include stdio.hint main() {int nums1[] {1, 2, 4};int nums2[] {1, 2, 4};printf(%d\n, minimumDifference(nums1, 3, 3)); // 输出 0printf(%d\n, minimumDifference(nums2, 3, 6)); // 输出 0return 0;}为什么不用滑动窗口按位或 不具有单调性· 子数组 [l, r] 向右扩展时or 值单调不减 ✅· 但向左收缩时or 值不一定减小可能保持不变或减少多个位无法通过双指针维护因此本题的标准解法是枚举每个右端点下的所有不同 or 值利用 or 值种类很少 的性质实现高效求解。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Beckhoff与ABB机器人Profinet通讯深度配置指南 2026/9/17 1:24:34

Beckhoff与ABB机器人Profinet通讯深度配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MATLAB人体异常行为检测GUI原理与工程化改造指南 2026/9/17 1:24:34

MATLAB人体异常行为检测GUI原理与工程化改造指南

简介:本资源是一套基于MATLAB实现的视频人体异常行为检测与识别系统,配套GUI交互界面,面向计算机视觉初学者、本科毕业设计学生及智能监控方向实践者,解决运动目标检测、行为分类与可视化反馈等核心问题。压缩包共769个文件&#…

阅读更多 →
STC89C51森林防火系统:低成本边缘节点设计与Proteus仿真实现 2026/9/17 1:24:34

STC89C51森林防火系统:低成本边缘节点设计与Proteus仿真实现

简介:本资源是一套基于STC89C51单片机的森林防火系统完整开发套件,面向嵌入式初学者、课程设计学生及单片机实践爱好者,解决传统火灾监测响应滞后、人工依赖强等实际问题。压缩包共78个文件,含5个核心C源码与3个头文件&#xff08…

阅读更多 →
lanproxy内网穿透实战:纯Java TCP隧道搭建指南 2026/9/17 1:24:34

lanproxy内网穿透实战:纯Java TCP隧道搭建指南

1. 项目概述:为什么用 lanproxy 做内网穿透,而不是直接抄个 ngrok 教程?lanproxy 是一个纯 Java 编写的轻量级内网穿透代理工具,核心目标就一件事:让没有公网 IP 的设备(比如你家里的树莓派、测试服务器、本…

阅读更多 →
Lance Rust 核心开发规范:代码风格、并发边界、API 设计与错误处理实战指南 2026/9/17 1:24:34

Lance Rust 核心开发规范:代码风格、并发边界、API 设计与错误处理实战指南

Lance Rust 核心开发规范:代码风格、并发边界、API 设计与错误处理实战指南 【免费下载链接】lance Open Lakehouse Format for Multimodal AI. Convert from Parquet in 2 lines of code for 100x faster random access, vector index, and data versioning. Compa…

阅读更多 →
Warp 基准评测协议:如何对 GPU 加速候选做出可复现、可辩护的性能测量 2026/9/17 1:21:34

Warp 基准评测协议:如何对 GPU 加速候选做出可复现、可辩护的性能测量

Warp 基准评测协议:如何对 GPU 加速候选做出可复现、可辩护的性能测量 【免费下载链接】warp A Python framework for GPU-accelerated simulation, robotics, and machine learning. 项目地址: https://gitcode.com/GitHub_Trending/warp/warp 在评估"…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞