三数和算法及其思考

三数和算法

1、三重循环 去获取每次值相加,获取到相对应的值

缺点:虽然简单实现,但是复杂度为n3,时间比较复杂

2、循环加双指针 先排序 然后外层循环 内层用双指针的模式去遍历和比较

相对而言 减少了一层循环,且比较过程中可以部分剪枝

变种:三数和最接近target的算法

思考:我们拿到一个题目的时候,遇到不熟悉的内容的时候经常会首先想到蛮干,然后写出来的内容就显得相对比较冗余和复杂。实际上我们应该首先把题干和结论用相对比较简洁的语言重新表述,比如符号,然后推理要实现的步骤,写一些简单伪代码,然后从中看是否有我们能够联想或者思考到的剪枝或者偷懒方法,即优化的思路。

附实现的python代码:

def three_num2(nums):    ‘‘‘    三数之和为0    :param nums:    :return:    先排序    然后首尾同号则肯定大于0    处理相同的数字    左边正数也肯定大于0    ‘‘‘    nums.sort()    n_len = len(nums)    lst = []    i = 0    while i < n_len:        if nums[i] > 0: break # 左边正数 则退出        first = i + 1        last = n_len - 1        while first < last:            if first >= last or nums[i] * nums[last] > 0: break            result = nums[i] + nums[first] + nums[last]            if result == 0:                lst.append([nums[i], nums[first], nums[last]])            if result <= 0:                while first < last and nums[first] == nums[first + 1]:                    first += 1                first += 1            else:                while first < last and nums[last] == nums[last - 1]:                    last -= 1                last -= 1        while nums[i] == nums[i+1]: i +=1        i += 1        print(i)    return lst

原文地址:https://www.cnblogs.com/shuliyuanshi/p/12663009.html

时间: 2024-10-12 19:16:58

三数和算法及其思考的相关文章

【算法练习题】力扣练习题——数组(2):三数之和

原题说明: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]] 原题链接:https://leetcode-cn.com/problems/3sum 解法一:基于HashMap的暴力求解 参考力扣题

[LintCode/LeetCode]——两数和、三数和、四数和

LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号:56,链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1

【数据结构】大量数据(20万)的快速排序的递归与非递归算法、三数取中思想

快速排序的挖坑法与prev.cur法,我们在上一篇博客的第6个排序中讲的非常详细,http://10740184.blog.51cto.com/10730184/1774508[数据结构]常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序) 有兴趣的话,相信聪明的你,一看就会秒懂快速排序的思想. 下面,我们将快速排序优化: 1.三数取中来优化快速排序 优化原因: 快速排序的擦差不多每次将序列一分为二,时间复杂度是O(n*lgn). 我们思考,快速排序的时间复杂度是O(n

LeetCode15题: 寻找三数和,附完整代码

本文始发于个人公众号:TechFlow 今天介绍的算法题是LeetCode 15题,3 Sum,也成三数求和问题. Link 3Sum 难度 Medium 描述 给定一个整数的数组,要求寻找当中所有的a,b,c三个数的组合,使得三个数的和为0.注意,即使数组当中的数有重复,同一个数也只能使用一次. Given an array nums of n integers, are there elements a , b , c in nums such that a + b + c = 0? Fin

查找第K小的数 BFPRT算法

BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并不了解其细节.本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法. 一 基本思路 关于选择第k小的数有许多方法 将n个数排序(比如快速排序或归并排序),选取排序后的第k个数,时间复杂度为O(nlogn). 维护一个k个元素的最大堆,存储当前遇到的最小的k个数,时间复杂度为O(nlogk).这种方法同样适用于海量数据的处理. 部分的快速排序(快速选择算法)

数据挖掘算法学习(三)NaiveBayes算法

算法简单介绍 NBC是应用最广的分类算法之中的一个.朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同一时候,NBC模型所需预计的參数非常少,对缺失数据不太敏感,算法也比較简单. 算法如果 给定目标值时属性之间互相条件独立. 算法输入 训练数据   T={(x1,y1),(x2,y2),--,(xn,yn)} 待分类数据x0=(x0(1),x0(2),--,x0(n))T 算法输出 待分类数据x0的分类结果y0∈{c1,c2,--,ck} 算法思想 weka执行 以we

hihoCoder - 1093 - 最短路径&#183;三:SPFA算法 (SPFA)

#1093 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festiv

第三版《算法导论》中的15.3-6关于动态规划新增题解

题目: 15.3-6假定你希望兑换外汇,你意识到与其直接兑换,不如进行多种外币的一系列兑换,最后兑换到你想要的那种外币,可能会获得更大收益.假定你可以交易n种不同的货币,编号为1,2.....n,兑换从1号货币开始,最终兑换为n号货币.对每两种货币i和j给定汇率rij,意味着你如果有d个单位的货币i,可以兑换dr0个单位的货币j.进行一系列的交易需要支付一定的佣金,金额取决于交易次数.令ck表示k次交易需要支付的佣金.证明:如果对所有k=1,2...n,ck=0,那么寻找最优兑换序列的问题具有最

空间复杂度为O(1)的回文数判定算法

空间复杂度为O(1)的回文数判定算法 一.题设 实现空间复杂度为O(1)的回文数判定,输入为整型常数,要求输出判断是否为回文数. 要求格式如下: public boolean isPalindrome(int x) { //Your judge code } 二.概念 回文数(Palindrome)的定义:设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 特点: 1.负数.