当前位置: 首页 > news >正文

做网站ps的图片电商网站开发 文献综述

做网站ps的图片,电商网站开发 文献综述,石家庄自己怎么做网站啊,wordpress论坛程序题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a b c d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以包…

题目

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

思路 

四数之和,和代码随想录阅读笔记-哈希表【三数之和】-CSDN博客是一个思路,都是使用双指针法, 基本解法就是在代码随想录阅读笔记-哈希表【三数之和】-CSDN博客的基础上再套一层for循环。但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是[-4, -3, -2, -1]target-10,不能因为-4 > -10而跳过。但是我们依旧可以去做剪枝,逻辑变成nums[i] > target && (nums[i] >=0 || target >= 0)就可以了。

代码随想录阅读笔记-哈希表【三数之和】-CSDN博客的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。

四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。那么一样的道理,五数之和、六数之和等等都采用这种解法。

对于代码随想录阅读笔记-哈希表【三数之和】-CSDN博客双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。

之前博客的经典题目:代码随想录阅读笔记-哈希表【四数相加II】-CSDN博客,相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。而​​​​​​​代码随想录阅读笔记-哈希表【四数相加II】-CSDN博客是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少。

我们来回顾一下,几道题目使用了双指针法。

双指针法将时间复杂度:O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,除了本题还有之前写过的题目如下:

  • 代码随想录阅读笔记-数组【移除元素】-CSDN博客
  • 代码随想录阅读笔记-哈希表【三数之和】-CSDN博客

链表相关双指针题目:

  • 代码随想录阅读笔记-链表【反转链表】-CSDN博客
  • 代码随想录阅读笔记-链表【删除链表倒数第n节点】-CSDN博客
  • 代码随想录阅读笔记-链表【链表相交】-CSDN博客
  • 代码随想录阅读笔记-链表【环形链表II】-CSDN博客

双指针法在字符串题目中还有很多应用,后面还会介绍到。

C++代码:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;sort(nums.begin(), nums.end());for (int k = 0; k < nums.size(); k++) {// 剪枝处理if (nums[k] > target && nums[k] >= 0) {break; // 这里使用break,统一通过最后的return返回}// 对nums[k]去重if (k > 0 && nums[k] == nums[k - 1]) {continue;}for (int i = k + 1; i < nums.size(); i++) {// 2级剪枝处理if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}// 对nums[i]去重if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) {right--;// nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出} else if ((long) nums[k] + nums[i] + nums[left] + nums[right]  < target) {left++;} else {result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});// 对nums[left]和nums[right]去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}}return result;}
};
  • 时间复杂度: O(n^3)
  • 空间复杂度: O(1)

优化二级剪枝的部分:

if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;
}

可以优化为:

if (nums[k] + nums[i] > target && nums[i] >= 0) {break;
}

因为只要 nums[k] + nums[i] > target,那么想要符合题意的唯一条件就是此时nums[k] 和 nums[i]都为负数,所以需要nums[i]后面还有负数,才能使和变小进而去接近target,那么 nums[i] 后面的数都是正数的话,就一定 不符合条件了。

http://www.yayakq.cn/news/377778/

相关文章:

  • 北京公司网站怎么制作自助网站建设软件
  • 请写出网站建设前期需要做的准备做门户网站的思路
  • 有哪些做短租的网站好1688官网登录入口
  • 网站建设找哪一家好seo工程师是做什么的
  • 关于旅行社网站规划建设方案书建网站过程
  • 珠宝行业网站建设短网址在线生成工具
  • 网站上的动效是用ae做的动画设计与制作教案
  • 开发大型网站的流程ps 矢量素材网站
  • 网站文章后台写完前台不显示网页编辑代码模板
  • 网站搭建网站管理微信红包封面分销平台
  • 免费的小网站旅游网站网页设计图片
  • 秦皇岛市城乡建设局网站天津网络推广公司
  • 大型门户网站设计局域网访问wordpress
  • 有没有兼职做设计的网站吗网站开发运营推广叫什么
  • 像优酷这样的网站需要怎么做怎么 从头开始建设一个网站
  • 响应式 网站 开发镇海住房和建设交通局网站
  • 网站开发看书网站的认识
  • 高港网站开发网站开发思路
  • 营销型网站建设网站建设资讯iis7配置thinkphp网站
  • 网站开发实施方案进度外管局网站上做预收登记
  • 一个域名对应多个网站网页设计实训总结和体会
  • 前端 网站开发 常见功能实现域名 备案号 网站的关系
  • 黑色网站后台wordpress 分类不显示全文
  • 文字云网站买拆车件上什么网站
  • 辽宁大连网站建设wordpress怎么增加按钮
  • 数据库网站开发价格做网站建站
  • 企业网站建设与网页制作erp软件开发定制
  • 网站建设与管理logogoogle搜索引擎免费入口
  • 微信小程序做链接网站photoshop快捷键命令大全
  • 中山网站建设价格低重庆市建设网站首页