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. 文件夹65ad47d7-2e27-4a5c-b238-26643fdaeb98

    这几天发现电脑中毒了,本地开的服务预览页面时,页面会被插入Html代码.我用360扫描之后发现有木马病毒(c:\programData有个65ad47d7-2e27-4a5c-b238-26643fd ...

  3. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  4. 蓝桥杯 BASIC 24 龟兔赛跑预測(模拟)

    [思路]:模拟.注意一个是在兔子歇息的时间乌龟可能到达了.刚開始没考虑WA80%. [AC代码]: #include <iostream> #include <algorithm&g ...

  5. oracle修改字符集后数据库不能启动

    最近在做修改字符集的实验,悲剧的是修改后重启,数据库启动不了. SQL> alter system set nls_language='AMERICAN'   scope = spfile; S ...

  6. 消息摘要算法-HMAC算法

    一.简述 mac(Message Authentication Code.消息认证码算法)是含有密钥散列函数算法.兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也常常被称作HMA ...

  7. Qt使用QGraphicsView实现滑动窗体效果

    QGraphicsView用来显示一个滚动视图区的QGraphicsScene内容.QGraphicsScene提供了QGraphicsItem的容器功能.通常与QGraphicsView一起使用来描 ...

  8. rsync+sersync实现数据文件实时同步

    一.简介 sersync是基于Inotify开发的,类似于Inotify-tools的工具: sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字: ...

  9. SDK命令行操作

    * 使用前需要先在path中添加Android SDK的环境变量,跟Java JDK的配置相同 我当前目录如下:F:\Program\Android SDK\tools:F:\Program\Andr ...

  10. iphone开发 IOS 组织架构图

    转载自 :http://blog.csdn.net/mashi321323/article/details/18267719   登录|注册     mashi321323的专栏       目录视图 ...