news 2026/5/7 7:26:53

力扣题解

作者头像

张小明

前端开发工程师

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/5/2 19:14:33

毕设项目 基于大数据的K-means广告效果分析

基于大数据的K-means广告效果分析 项目运行效果&#xff1a; 毕业设计 基于大数据的K-means广告效果分析&#x1f9ff; 项目分享:见文末! 一、分析背景和目的 在大数据时代的背景下&#xff0c;广告主可以购买媒介变成直接购买用户&#xff0c;广告的精准投放对广告主、服务…

作者头像 李华
网站建设 2026/5/5 21:46:50

【计算机毕设选题推荐】基于Hadoop+Django的股市行情数据可视化分析平台 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

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

Unity学习笔记(十六)GUI总述

什么是GUI是即时模式游戏用户交互界面&#xff0c;在Unity中一般简称为GUI&#xff0c;是一个代码驱动的UI系统。GUI的主要作用1 作为程序员的调试工具&#xff0c;创建游戏内调试工具。2 为脚本组件创建自定义检视面板&#xff0c;创建新的编辑器窗口和工具扩展unity本身&…

作者头像 李华
网站建设 2026/4/19 14:48:33

ResCLIP

ResCLIP动机 现有方法&#xff08;如SCLIP、NACLIP&#xff09;通过将最后一层的标准交叉相关自注意力&#xff08;C2SAC^2SAC2SA, Query-Key&#xff09;替换为自相关自注意力&#xff08;SCSA, Query-Query或Key-Key&#xff09;来解决空间不变性问题 。然而&#xff0c;这些…

作者头像 李华
网站建设 2026/5/1 11:43:20

红黑树入门指南(C语言版)

红黑树入门指南&#xff08;C语言版&#xff09; 文章目录红黑树入门指南&#xff08;C语言版&#xff09;前言一、红黑树的基本概念1.1 核心定义1.2 关键特性二、红黑树的操作2.1 旋转&#xff08;Rotation&#xff09;左旋&#xff08;Left Rotation&#xff09;右旋&#xf…

作者头像 李华
网站建设 2026/4/23 15:20:07

K-Diffusion终极指南:从零掌握扩散模型图像生成

K-Diffusion终极指南&#xff1a;从零掌握扩散模型图像生成 【免费下载链接】k-diffusion Karras et al. (2022) diffusion models for PyTorch 项目地址: https://gitcode.com/gh_mirrors/kd/k-diffusion K-Diffusion是基于PyTorch实现的先进扩散模型库&#xff0c;专门…

作者头像 李华