[经典] 指定数目与和问题

Two Sum I

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

分析:如果数组已经排序完,那么只需要双指针从两端往中间夹即可。但是没有排序的话,先排序复杂度就已经O(nlogn)了,所以没法用排序法。事实上是有O(n)的hash法:首先遍历一遍,全部放入hashtable(unordered_set)中,复杂度为O(n);然后再对于每个数x,都在hashtable中找target - x的数在不在其中,如果在,就结束,因为题目说假设只有一个答案,复杂度为O(n);总复杂度为O(n)。

Two Sum II - Input array is sorted 

不用排序的排序法,因为数组已经排序完,从两端往中间夹的复杂度与hash法一样也为O(n);但理论时间开销应该比hash法小的。

Two Sum III - Data structure design

3 Sum

与Two Sum题目类似,二元换成了三元。两种解法,复杂度均为O(n^2)

  1. hash法,把两两的和放到一个hashmap(unordered_multimap<int,pair<int,int>>),三个int分别为“和”,“第一个index”,“第二个index”。从头到尾匹配,遇到index在两个之中的,则非解;不在两个中的,则为合法解。
  2. 排序法,然后对任何一个选取x,都在x后面从两边往中间夹,选取和为target - x的

3 Sum Closest

这个3 Sum的排序法,可解出,复杂度为O(n ^ 2)。没法用hash法。

3 Sum Smaller

Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.

For example, given nums = [-2, 0, 1, 3], and target = 2.

Return 2. Because there are two triplets which sums are less than 2:

[-2, 0, 1]
[-2, 0, 3]

Follow up: Could you solve it in O(n^2) runtime?

暴力解法是O(n^3)。用Sum的排序法,可接出,复杂度为O(n ^ 2)。

没法用hash法,顶多用multimap做,但复杂度为O(n^2*logn)。

4 Sum

从二元到三元再到四元

  1. 用排序法,复杂度有O(n^3)
  2. 用hash法,复杂度为O(n^2),通过两个unorder_multiple<int, pair<int, int>>,然后比对pair中的index是否重复了,来决定结果是否符合要求。

【总结】到这里为止,我们基本也可以总结出这NSum类型的解法:

  1. 排序法是万能的,复杂度为O(max(nlogn, n^(N-1));
  2. hash法能也不错,复杂度为O(n^(ceiling(log2N)))

【Combination Sum I】

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 2,3,6,7 and target 7
A solution set is: 
[7] 
[2, 2, 3]

【Combination Sum II】

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

For example, given candidate set 10,1,2,7,6,1,5 and target 8
A solution set is: 
[1, 7] 
[1, 2, 5] 
[2, 6] 
[1, 1, 6]

【Combination Sum III】

Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

Ensure that numbers within the set are sorted in ascending order.

Example:

Input: k = 3, n = 9

Output:

[[1,2,6], [1,3,5], [2,3,4]]

思路

时间: 2024-09-30 13:20:43

[经典] 指定数目与和问题的相关文章

字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符

split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如下: var mystr = "www.imooc.com"; document.write(mystr.split(".")+"<br>"); document.write(mystr.split(".", 2)+&

提取指定数目的字符substr()

提取指定数目的字符substr() substr() 方法从字符串中提取从 startPos位置开始的指定数目的字符串. 语法: stringObject.substr(startPos,length) 参数说明: 注意:如果参数startPos是负数,从字符串的尾部开始算起的位置.也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推. 如果startPos为负数且绝对值大于字符串长度,startPos为0. 使用 substr() 从字符串中提取一些字符,代码如下: <sc

算法生成指定数目的随机数

package text; import java.util.Scanner; public class random { public static void main(String[] args) { int a=13, b=35,m=87,Xo=19; int z=Xo; System.out.print("请输入生成随机数的个数:"); Scanner cin1=new Scanner(System.in); int j=cin1.nextInt(); int q=0; for

javascript如何删除数组中指定的元素

javascript如何删除数组中指定的元素: 本章节将通过实例简单介绍一下如何删除数组中的元素,希望给需要的朋友带来帮助. 删除数组元素的方式有多种,下面简单介绍一下常用的几种方式: 一.使用delete进行删除: 代码实例如下: var myArray=new Array() myArray[0]="蚂蚁部落"; myArray[1]="青岛"; myArray[2]="奋斗才会有美好的未来"; delete myArray[1] alert

iOS开发——swift篇&amp;经典语法(九)析构

析构 在一个类的实例被释放之前,析构函数会被调用.用关键字deinit来定义析构函数,类似于初始化函数用init来定义.析构函数只适用于class类型. 1.析构过程原理 Swift 会自动释放不再需要的实例以释放资源.如自动引用计数那一章描述,Swift 通过自动引用计数(ARC)处理实例的内存管理.通常当你的实例被释放时不需要手动地去清理.但是,当使用自己的资源时,你可能需要进行一些额外的清理. 例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前关闭该

python 在指定的文件夹下生成随机的测验试卷文件

#! python3 #在指定的路径中生成指定数目的测验试卷和参考答案文本,试卷内容是测验对我国28个省级行政区的省会城市的选择, #要求每份试题的试题顺序不同,不同试卷中相同试题的选项随机抽取. import random import os # 各省及其省会的字典数据 capitals = {'新疆': '乌鲁木齐', '甘肃': '兰州', '宁夏': '银川', '陕西': '西安', '青海': '西宁', '西藏': '拉萨', '贵州': '贵阳', '内蒙古': '呼和浩特',

浅析线程间通信一:互斥量和条件变量

线程同步的目的简单来讲就是保证数据的一致性.在Linux中,常用的线程同步方法有互斥量( mutex ).读写锁和条件变量,合理使用这三种方法可以保证数据的一致性,但值得的注意的是,在设计应用程序时,所有的线程都必须遵守相同的数据访问规则为前提,才能保证这些同步方法有效,如果允许某个线程在没有得到访问权限(比如锁)的情况下访问共享资源,那么其他线程在使用共享资源前都获得了锁,也会出现数据不一致的问题.另外还有自旋锁.barrier和信号量线程同步方法.本文将讨论互斥量和条件变量的使用,并给出了相

JS学习之路,菜鸟总结的注意事项及错误更正

JavaScript 是一种面向对象的动态语言,它的语法来源于 Java 和 C,所以这两种语言的许多语法特性同样适 用于 JavaScript.需要注意的一个主要区别是 JavaScript 不支持类,类这一概念在 JavaScript 通过对象原型 (object prototype)得到延续(有关 ES6 类的内容参考这里Classes).另一个主要区别是 JavaScript 中的 函数也是对象,JavaScript 允许函数在包含可执行代码的同时,能像其他对象一样被传递.1,scrip

MCMC: The Metropolis Sampler

本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\),我们无法直接进行采样.为了实现这样的目的,我们需要为马尔可夫链设计一个状态转移算子(transition operator),是的这个马尔可夫链的稳态分布与目标分布吻合.Metropolis 采样算法(更通常的是 Metropolis-Hastings 采样算法)采用简单的启发式方法实现了这样的状