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

ai里做的图片方网站上不清楚西安网站关键词优化推荐

ai里做的图片方网站上不清楚,西安网站关键词优化推荐,拓展如何在网上推广,wordpress指定ip登陆题目说明 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 给定数组 nums [-1, 0,…

题目说明

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

题目分析

这个问题比起两数之和来,显然要复杂了一些,而且由于结果可能有多种情况,还要考虑去重,整体难度提升了不少。
最后的返回,就不再是一个简单的数组了,而是“数组的数组”,每一组解都是一个数组,最终有多组解都要返回。

解题方法

方法一:暴力法

最简单的办法,当然还是暴力法。基本思路是,每个人都先去找到另一个人,然后再一起逐个去找第三个人。
很容易想到,实现起来就是三重循环:这个时间复杂度是 O(n^3)。

下面展示一些 内联代码片

    public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;List<List<Integer>> resultList = new ArrayList<>();
// 三重循环,遍历所有的三数组合for( int i = 0; i < n - 2; i++ ){for( int j = i + 1; j < n - 1; j++ ){for( int k = j + 1; k < n; k++ ){if( nums[i] + nums[j] + nums[k] == 0 ){resultList.add(Arrays.asList(nums[i], nums[j], nums[k]));}}}}return resultList;}

运行一下,我们会发现,这个结果其实是不正确的没有去重,同样的三元组在结果中无法排除。比如-1,0,1会出现两次。而且时间复杂度非常高,是N^3。
所以接下来,我们就要做一些改进,试图降低时间复杂度,而且解决去重问题。

暴力法的改进:结果去重

要做去重,自然首先想到的,就是把结果保存到一张hash表里。仿照两数之和,直接存到HashMap里查找,代码如下:

    public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;List<List<Integer>> result = new ArrayList<>();Map<Integer, List<Integer>> hashMap = new HashMap<>();// 遍历数组,寻找每个元素的thatNumfor( int i = 0; i < n; i++ ){int thatNum = 0 - nums[i];if( hashMap.containsKey(thatNum) ){List<Integer> tempList = new ArrayList<>(hashMap.get(thatNum));tempList.add(nums[i]);result.add(tempList);continue;}for( int j = 0; j < i; j++ ){int newKey = nums[i] + nums[j];if( ! hashMap.containsKey(newKey) ){List<Integer> tempList = new ArrayList<>();tempList.add(nums[j]);tempList.add(nums[i]);hashMap.put( newKey, tempList );}}}return result;}

方法二 双指针法

思路解析
暴力法搜索时间复杂度为O(N^3),要进行优化,可通过双指针动态消去无效解来提高效率。
双指针的思路,又分为左右指针和快慢指针两种。
我们这里用的是左右指针。左右指针,其实借鉴的就是分治的思想,简单来说,就是在数组头尾各放置一个指针,先让头部的指针(左指针)右移,移不动的时候,再让尾部的指针(右指针)左移:最终两个指针相遇,那么搜索就结束了。

(1)双指针法铺垫: 先将给定 nums 排序,复杂度为 O(NlogN)。
首先,我们可以想到,数字求和,其实跟每个数的大小是有关系的,如果能先将数组排序,那后面肯定会容易很多。
之前我们搜索数组,时间复杂度至少都为O(N^2),而如果用快排或者归并,排序的复杂度,是 O(NlogN),最多也是O(N^2)。所以增加一步排序,不会导致整体时间复杂度上升。

public List<List<Integer>> threeSum(int[] nums){int n = nums.length;List<List<Integer>> result = new ArrayList<>();// 先对数组进行排序Arrays.sort(nums);for( int i = 0; i < n; i++ ){if( nums[i] > 0 )break;if( i > 0 && nums[i] == nums[i-1] )continue;// 定义左右指针(索引位置)int lp = i + 1;int rp = n - 1;// 只要左右不重叠,就继续移动指针while( lp < rp ){int sum = nums[i] + nums[lp] + nums[rp];if( sum == 0 ){result.add(Arrays.asList(nums[i], nums[lp], nums[rp]));lp ++;rp --;while( lp < rp && nums[lp] == nums[lp - 1] )lp ++;while( lp < rp && nums[rp] == nums[rp + 1] )rp --;}else if( sum < 0 )lp ++;elserp --;}}return result;}

复杂度分析:
时间复杂度 O(N^2):其中固定指针k循环复杂度 O(N),双指针 i,j 复杂度 O(N)。比暴力法的O(n^3),显然有了很大的改善。
空间复杂度 O(1):指针使用常数大小的额外空间。

尽管时间复杂度依然为O(n^2),但是过程中避免了复杂的数据结构,空间复杂度仅为常数级O(1),可以说,双指针法是一种很巧妙、很优雅的算法设计。

http://www.ds6.com.cn/news/34052.html

相关文章:

  • 深圳规模较大的网站建设公司seo优化网站
  • 网站排名和什么有关3000块钱在朋友圈投放广告
  • 汽车租赁网站开发武汉最新今天的消息
  • 赤峰微网站建设厦门seo优化推广
  • 瑞安市住房和城乡建设局网站手机端关键词排名优化软件
  • 宝塔里面一个服务器做多个网站百度信息流推广
  • wordpress文章调用函数宁波seo软件免费课程
  • 市场营销女生好就业吗?搜索引擎营销优化策略有哪些
  • 网页设计个人网站心得体会网站推广app
  • 关于自己公司的网站怎么做推广营销软件
  • wordpress tags页面乐陵市seo关键词优化
  • 什么网站可以找人做设计2023疫情最新消息今天
  • wordpress如何知道用户数量厦门最快seo
  • 北京网络职业学院学费seo页面代码优化
  • 合肥网站建设专业设计快速学电脑培训班
  • 泉州app网站开发价格低怎么样建网站
  • wordpress需要先安装数据库seo如何优化
  • 网站解析 cname厦门人才网597人才网
  • 可以做公司宣传的网站有哪些手机百度正式版
  • 有哪些可以免费做高数题的网站网络营销收获与体会
  • html怎么做静态网站免费站推广网站不用下载
  • 校园社交网站开发的目的与意义山东seo多少钱
  • 池州网站建设中国新闻最新消息
  • 武汉企业做网站找哪家好苏州seo网站优化软件
  • 做b2b比较好的网站深圳关键词seo
  • 现在建网站做推广能赚钱吗重庆森林经典台词独白
  • 做软件的网站产品怎么做市场推广
  • 手机网站建设万网衡水seo培训
  • 网站建设发展趋势打开网站搜索
  • 十大免费文案网站搜客