Sum类的题目一般这样:

input: nums[], target

output: satisfied arrays/ lists/ number

拿到题目,首先分析:

1. 是几个数的sum

2. sum是要求等于target还是小于还是大于还是closest

3. 返回的是原数组下标还是其他

对于这类题目,我们经常用双指针的方法。即排序后,左指针指向起点,右指针指向终点。

  • 如果sum等于target,加入结果/总数目+1
  • 如果sum大于target,右指针左移
  • 如果sum小于target,左指针右移

还有些情况下,我们需考虑去重。去重有两种方法:

  • 利用HashSet预先存下满足条件的值
  • 指针移动去重

第一种方法由于常常需要更多的空间,所以不太建议。

第二种方法的模板是:先判断值,再去重。(去重是当前的element和它前一个element比较)

这里给出一个 n Sum 的模板

 public class Solution {
public void nSum(int[] nums, int target) {
// Check whether input is valid
if (nums == null || nums.length < n) {
return;
} // Sort input array
Arrays.sort(nums); // Fix one parameter
int length = nums.length;
for (int i = 0; i < length - n + 1; i++) {
// Avoid duplicate 1
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
} // Fix more parameters
...
// Until two parameters left // start and end are decided by innerest parameter value
int left = start;
int right = end;
while (left < right) {
int sum = nums[i] + .. + nums[left] + nums[right];
if (sum == target) {
// Some action
left++;
right--;
// Avoid duplicate 2
while (left < right && nums[left] == nums[left - 1]) {
left++;
}
while (left < right && nums[right] == nums[right + 1]) {
right--;
}
} else if (sum < target) {
left++;
while (left < right && nums[left] == nums[left - 1]) {
left++;
}
} else {
right--;
while (left < right && nums[right] == nums[right + 1]) {
right--;
}
}
}
}
}
}

Example:

Two Sum II

3Sum

以下是模板的变型问题:

1. 要返回原数组的下标。

这种情况下就不太好排序,因为排序会改变数组下标。

一般用HashMap做。

Example:

2Sum

2. 返回所有满足小于target的组合的数目

Example:

3Sum Smaller

3. 要求是closest

Example:

3Sum Closest

4. 利用HashMap化为2Sum问题

Example:

4Sum

Sum 类型题目总结的更多相关文章

  1. nSum “已知target再求和”类型题目总结:n-2重循环+left/right

    Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...

  2. leetcode math类型题目解题总结

    2. Add Two Numbers https://leetcode.com/problems/add-two-numbers/description/ class Solution { publi ...

  3. NMAP类型题目 (escapeshellarg,escapeshellcmd使用不当)

    [BUUCTF 2018]Online Tool 给出了源码 审计 <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER[' ...

  4. leetcode 链表类型题目解题总结

    最基础的方式要做到非常熟练,要熟练到不思考就能写,但又需明白各处的要求和陷阱 合并两个有序链表的操作,在前面加上一个初始节点,注意while循环和退出时的处理,理解如何处理其中一个链表遍历完的情况 L ...

  5. substring类型题目的解题模板

    https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-pr ...

  6. 编辑距离Edit Distance 非常典型的DP类型题目

    https://leetcode.com/problems/edit-distance/?tab=Description 真的非常好,也非常典型. https://discuss.leetcode.c ...

  7. [LeetCode] Largest Sum of Averages 最大的平均数之和

    We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...

  8. 2016年第七届蓝桥杯C/C++B组省赛题目解析

    题目1:煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?请填 ...

  9. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

随机推荐

  1. poj1305:概念水题

    了解一下毕达哥拉斯三元组概念= = 暴力求出所有的本源三元组即可 代码: #include <iostream> #include <stdio.h> #include< ...

  2. 论 <%@taglib prefix="s" uri="/struts-tags" %> 的重要性

    前段时间在做项目的时候,碰到这个问题 结果是相应的内容显示不出来,原来是忘了这句很关键的引入:<%@taglib prefix="s" uri="/struts-t ...

  3. 用于防SQL注入的几个函数

    不要相信用户的在登陆中输入的内容,需要对用户的输入进行处理 SQL注入: ' or 1=1 # 防止SQL注入的几个函数: addslashes($string):用反斜线引用字符串中的特殊字符' & ...

  4. Excel函数大全

    我们在使用Excel制作表格整理数据的时候,经常要用到它的函数功能来自己主动统计处理表格中的数据.这里整理了Excel中使用频率最高的函数的功能.用法,以及这些函数在实际应用中的实例剖析,并配有具体的 ...

  5. Js字面变量,定义问题

    Js字面变量.浏览器的版本问题:

  6. (转)C#之玩转反射

    前言 之所以要写这篇关于C#反射的随笔,起因有两个:   第一个是自己开发的网站需要用到   其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...

  7. 洛谷 P3395 路障

    P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个方 ...

  8. (原创) ubuntu 12.04 install nvidia by the deb

    先安装 驱动 1. sudo dpkg -i  XXX.deb 2. sudo apt-get update 3. sudo apt-get install cuda 4. gedit ~/.bash ...

  9. 从配置文件中读取数据获取Connection

    配置文件 db.driver=com.mysql.jdbc.Driver db.url=jdbc\:mysql\://localhost\:3306/mybase db.user=root db.ps ...

  10. window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang

    部分内容参考:http://www.aspbc.com/tech/showtech.asp?id=1256 在开发的过程中,经常使用window.onload和body onload两种,很少使用do ...