求数组中两两相加等于20的组合(Python实现)
题目
求数组中两两相加等于20的组合。
例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20。
解析
分为两个步骤:
- 先采用堆排序或快速排序对数组进行排序,时间复杂度为O(nlogn)。
 - 然后对排序的数组分别从前到后和从后到前进行遍历, 时间复杂度为O(n)。
 
假设从前到后遍历的下标为begin,从后到前遍历的下标为end。
- 当arr[begin] + arr[end] < 20时,满足条件的数一定在[begin+1, end]之间;
 - 当arr[begin] + arr[end] > 20时,满足条件的数一定在[begin, end-1]之间;
 - 当arr[begin] + arr[end] = 20时,找到一组符合条件的数,剩下的组合一定在[begin-1, end-1]之间。
 
整个算法的时间复杂度为O(nlogn)。
Python实现
# -*- coding:utf-8 -*-
def quick_sort(arr, left, right):
    """快速排序"""
    if left >= right:
        return
    low = left
    high = right
    p = arr[left]
    while left < right:
        while left < right and arr[right] >= p:
            right -= 1
        arr[left] = arr[right]
        while left < right and arr[left] <= p:
            left += 1
        arr[right] = arr[left]
    arr[left] = p
    quick_sort(arr, low, left-1)
    quick_sort(arr, left+1, high)
def find_sum(arr, sum):
    """寻找数组中相加等于sum的组合"""
    quick_sort(arr, 0, len(arr) - 1)
    begin, end = 0, len(arr) - 1
    while begin < end:
        if arr[begin] + arr[end] < sum:
            begin += 1
        elif arr[begin] + arr[end] > sum:
            end -= 1
        else:
            print('%s %s' % (arr[begin], arr[end]))
            begin += 1
            end -= 1
if __name__ == '__main__':
    arr = [1, 7, 17, 2, 6, 3, 14]
    find_sum(arr, 20)
参考资料
- 《Java程序员面试笔试宝典》
 
求数组中两两相加等于20的组合(Python实现)的更多相关文章
- 获取数组中多个相加等于0的一组数字 javascript
		
//获取数组中两个相加等于0的一对数字,比如[ [ -10, 10 ], [ -5, 5 ] ] var arr=[-5,10,1,-10,3,4,5,9] //对数组进行排序 arr.sort(fu ...
 - 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,  如果有多对数字的和等于S,输出两个数的乘积最小的。
		
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
 - 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
		
先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数. 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧: #inc ...
 - 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
		
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
 - LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
		
题目链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/#/description 给定一个已经排好序的数组 ...
 - C语言:一个数组中只有两个数字是出现一次
		
//1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...
 - 求数组中的逆序对的数量----剑指offer36题
		
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...
 - php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)
		
php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...
 - 常用的函数式接口_Supplier和常用的函数式接口Supplier接口练习_求数组中元素最大值
		
Supplier接口 package com.yang.Test.SupplierStudy; import java.util.function.Supplier; /** * 常用的函数式接口 * ...
 
随机推荐
- java 多线程死锁
			
死锁案例: package com.test; public class DealThread implements Runnable { public String username; public ...
 - MariaDB 实现主从复制
			
實驗目的: MariaDB為MySQL的一個分支,其完全開源.無版權之虞且操作上與 MySQL 一脈相承,實際應用中非常廣泛,軟件本身很小,安裝容易,使用簡單. 但其也有缺點,指令行方式操作,無原生G ...
 - JAVA 框架之面向对象设计原则
			
面向对象设计原则: 单一职责原则 SRP : 一个类或者行为只做一件事 . 降低代码冗余,提高可重用性,可维护性,可扩展性,可读性 使用组合形式 里氏替换原则 LSP : 所有引用基类 ...
 - HTML5:使用postMessage实现Ajax跨域请求
			
HTML5:使用postMessage实现Ajax跨域请求 由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) do ...
 - 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)
			
题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...
 - 1008 选数  2002年NOIP全国联赛普及组
			
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description ...
 - 数据库迁移后报错提示MySQL Error:Can''t find file errno: 13 - Permission denied的解决方法
			
用户MYSQL数据库迁移后,遇到报错MySQL Error:Can't find file (errno: 13 - Permission denied)使用以下指令重新设置所有者和权限,依然不能解决 ...
 - Python各种参数类型
			
1. Python的参数传递是值传递还是引 举例说明Python函数参数传递的几种形式,并说明函数传参是值传递还是引用传递 一.位置参数 调用函数时根据函数定义的参数位置来传递参数.例子: def p ...
 - python+selenium之断言Assertion
			
一.断言方法 断言是对自动化测试异常情况的判断. # -*- coding: utf-8 -*- from selenium import webdriver import unittest impo ...
 - BZOJ 4777: [Usaco2017 Open]Switch Grass
			
4777: [Usaco2017 Open]Switch Grass Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 46 Solved: 10[Su ...