news 2026/8/21 13:34:58

力扣题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣题解

目录

410.分割数组的最大值

4.寻找两个正序数组的中位数

51.N皇后


410.分割数组的最大值

这个题可以运用二分答案的算法来解题。定义一个左指针和一个右指针,令左指针等于数组的最大值,令右指针等于数组所有数之和。即最终的结果一定在他们之间。

long long l = 0, r = 0; for (int i = 0; i < nums.size(); i++) { r += nums[i]; if (l < nums[i]) { l = nums[i]; } }

定义一个返回值ans。然后进行二分。

long long ans=0; while(l<=r) { long long mid=(l+r)/2; if(cheak(mid,nums,k)) { ans=mid; r=mid-1; } else { l=mid+1; } }

这个题的cheak函数里面需要定义一个值ans初始为1和求和变量sum;然后遍历数组,进行求和当sum大于mid的时候那么ans就进行加一给sum重新赋值。最后进行判断ans与k的大小。

bool cheak(long long mid,vector<int>& nums,int k) { long long sum=0; int ans=1; for(int i=0;i<nums.size();i++) { if(sum+nums[i]>mid) { ans++; sum=nums[i]; } else sum+=nums[i]; } return ans<=k; }

完整代码

class Solution { public: int splitArray(vector<int>& nums, int k) { long long l = 0, r = 0; for (int i = 0; i < nums.size(); i++) { r += nums[i]; if (l < nums[i]) { l = nums[i]; } } long long ans=0; while(l<=r) { long long mid=(l+r)/2; if(cheak(mid,nums,k)) { ans=mid; r=mid-1; } else { l=mid+1; } } return ans; } bool cheak(long long mid,vector<int>& nums,int k) { long long sum=0; int ans=1; for(int i=0;i<nums.size();i++) { if(sum+nums[i]>mid) { ans++; sum=nums[i]; } else sum+=nums[i]; } return ans<=k; } };

4.寻找两个正序数组的中位数

这个题首先考虑数组是否为空。

int n1 = nums1.size(); int n2 = nums2.size(); int n = n1 + n2; if (n1 == 0 || n2 == 0) { if (n1 == 0 && n2 == 0) { return 0; } else if (n1 == 0) { if (n2 % 2 == 1) return nums2[n2 / 2]; else return (nums2[n2 / 2 - 1] + nums2[n2 / 2]) / 2.0; } else { if (n1 % 2 == 1) return nums1[n1 / 2]; else return (nums1[n1 / 2 - 1] + nums1[n1 / 2]) / 2.0; } }

判断之后进行查找那个中位数。

首先需要判断两个数组加起来的数是奇数还是偶数。如果是奇数只需要找一个n/2+1就可以了。

偶数需要找n/2+1和n/2。

else { if (n % 2 == 1) { return twocz(nums1, nums2, n / 2 + 1); } else { return (twocz(nums1, nums2, n / 2) + twocz(nums1, nums2, n / 2 + 1)) / 2.0; } }

进行查找,首先我们要定义一个a和b指向两个数组的初始位置。设需要找的中位数位置为k。

令num1[min(a+k/2-1,num1.size()-1)]和num2[min(b+k/2-1,num2.size()-1)]比较大小。小的那一个可以直接排除掉。所以k进去排除的部分。一直进行循环。

直到a==num1.size()或b==num2.size()或k==1;返回相应的值。

int twocz(vector<int> nums1, vector<int> nums2, int k) { int n = nums1.size(); int m = nums2.size(); int a = 0; int b = 0; while (1) { if (a == n) { return nums2[b + k - 1]; } if (b == m) { return nums1[a + k - 1]; } if (k == 1) { return min(nums1[a], nums2[b]); } int c = min(a + k / 2 - 1, n - 1); int d = min(b + k / 2 - 1, m - 1); int j1 = nums1[c]; int j2 = nums2[d]; if (j1 <= j2) { k -= c - a + 1; a = c + 1; } else { k -= d - b + 1; b = d + 1; } } }

完整代码

int twocz(vector<int> nums1, vector<int> nums2, int k) { int n = nums1.size(); int m = nums2.size(); int a = 0; int b = 0; while (1) { if (a == n) { return nums2[b + k - 1]; } if (b == m) { return nums1[a + k - 1]; } if (k == 1) { return min(nums1[a], nums2[b]); } int c = min(a + k / 2 - 1, n - 1); int d = min(b + k / 2 - 1, m - 1); int j1 = nums1[c]; int j2 = nums2[d]; if (j1 <= j2) { k -= c - a + 1; a = c + 1; } else { k -= d - b + 1; b = d + 1; } } } class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n1 = nums1.size(); int n2 = nums2.size(); int n = n1 + n2; if (n1 == 0 || n2 == 0) { if (n1 == 0 && n2 == 0) { return 0; } else if (n1 == 0) { if (n2 % 2 == 1) return nums2[n2 / 2]; else return (nums2[n2 / 2 - 1] + nums2[n2 / 2]) / 2.0; } else { if (n1 % 2 == 1) return nums1[n1 / 2]; else return (nums1[n1 / 2 - 1] + nums1[n1 / 2]) / 2.0; } } else { if (n % 2 == 1) { return twocz(nums1, nums2, n / 2 + 1); } else { return (twocz(nums1, nums2, n / 2) + twocz(nums1, nums2, n / 2 + 1)) / 2.0; } } } };

51.N皇后

这个题运用了剪枝回溯法 定义三个bool变量分别判断列和两个对角线。之后与全排列相似。

完整代码

const int N=10; bool f1[10],f2[N+N],f3[N+N],f4[N+N]; void dfs(vector<vector<int>> &z,int n,int x,vector<int> &arr) { if(x==n) { z.push_back(arr); } for(int i=1;i<=n;i++) { if(x+1-i>=0) { if(!f1[i]&&!f2[x+1-i]&&!f4[x+1+i]) { f1[i]=true; f2[x+1-i]=true; f4[x+1+i]=true; arr[x]=i; dfs(z,n,x+1,arr); f1[i]=false; f2[x+1-i]=false; f4[x+1+i]=false; } } else { if(!f1[i]&&!f3[i-x-1]&&!f4[x+1+i]) { f1[i]=true; f3[i-x-1]=true; f4[x+1+i]=true; arr[x]=i; dfs(z,n,x+1,arr); f1[i]=false; f3[i-x-1]=false; f4[x+1+i]=false; } } } } class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<int>> z; vector<int> arr; for(int i=0;i<n;i++) { arr.push_back(0); } dfs(z,n,0,arr); vector<vector<string>> s; for(int i=0;i<z.size();i++) { vector<string>s1; for(int j=0;j<n;j++) { string s2; int a=z[i][j]; for(int z=0;z<n;z++) { if(z==a-1) s2.push_back('Q'); else s2.push_back('.'); } s1.push_back(s2); } s.push_back(s1); } return s; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 15:31:50

计算机毕业设计springboot电子病例系统 基于SpringBoot的智慧医疗病历管理平台 SpringBoot驱动的数字化门诊病历云系统

计算机毕业设计springboot电子病例系统a62vfg20 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。“排队三小时&#xff0c;看病三分钟”曾是不少患者的真实写照&#xff0c;纸质病…

作者头像 李华
网站建设 2026/8/20 22:36:21

windows系统深度学习环境配置

目录 一、windows安装git 三、更新CUDA驱动 3.1 更新驱动 3.2 看CUDA版本号 3.3 看文档 四、安装VS 4.1 安装vs2019或者2022 4.2 配置MSVC的环境变量 五、安装CUDA和cuDNN 5.1 下载cuda安装程序 5.2 安装CUDA 5.3 安装cuDNN 5.4 检查cuda版本 六、安装vscodeanac…

作者头像 李华
网站建设 2026/8/20 22:39:54

毕设项目 深度学习yolo11水果识别系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景2.1. 课题背景2.1.1 农业现代化与智能化需求2.1.2 计算机视觉在农业中的应用发展2.1.3 目标检测技术演进2.1.3.1 传统图像处理阶段&#xff08;2000-2012&#xff09;2.1.3.2 机器学习阶段&#xff08;2012-2016&#xff09;2.1.3.3 深…

作者头像 李华
网站建设 2026/8/19 10:00:50

孤能子视角:认知的“第一瞥”––认知框架、语言与思维

(继续探讨人工智能的"认知"。姑且当科幻小说看)我的问题:1.重温中西文明认知模式––"外观"与"内理"。2.你没明白我的意思:当初对世界的看法–认知是否有边界–思维和语言。我们的关系性&#xff0c;西方的实体性。3.你可以在看看其他文明&#…

作者头像 李华
网站建设 2026/8/20 16:27:51

无人船的Smith - PID跟踪控制探索

基于无人船的smith-pid跟踪控制资料。 首先&#xff0c;针对pid进行了改进&#xff0c;有传统pid&#xff0c;最优pid和基于smith的pid三种控制方式。 然后还在smithpid基础上设计了LOS的曲线跟踪方法。 &#xff08;有对应参考文献&#xff09;。 有意者可直接联系&#xff0c…

作者头像 李华
网站建设 2026/8/21 7:11:21

java计算机毕业设计社区疫情防控管理系统 街区智慧防疫信息管理平台 基层社区传染病防控综合系统

计算机毕业设计社区疫情防控管理系统372989 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情反复期间&#xff0c;社区卡口纸质登记、微信群接龙、人工电话追核酸造成数据碎片…

作者头像 李华