Sum 类型题目总结
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:
以下是模板的变型问题:
1. 要返回原数组的下标。
这种情况下就不太好排序,因为排序会改变数组下标。
一般用HashMap做。
Example:
2. 返回所有满足小于target的组合的数目
Example:
3. 要求是closest
Example:
4. 利用HashMap化为2Sum问题
Example:
Sum 类型题目总结的更多相关文章
- nSum “已知target再求和”类型题目总结:n-2重循环+left/right
Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...
- leetcode math类型题目解题总结
2. Add Two Numbers https://leetcode.com/problems/add-two-numbers/description/ class Solution { publi ...
- NMAP类型题目 (escapeshellarg,escapeshellcmd使用不当)
[BUUCTF 2018]Online Tool 给出了源码 审计 <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER[' ...
- leetcode 链表类型题目解题总结
最基础的方式要做到非常熟练,要熟练到不思考就能写,但又需明白各处的要求和陷阱 合并两个有序链表的操作,在前面加上一个初始节点,注意while循环和退出时的处理,理解如何处理其中一个链表遍历完的情况 L ...
- substring类型题目的解题模板
https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-pr ...
- 编辑距离Edit Distance 非常典型的DP类型题目
https://leetcode.com/problems/edit-distance/?tab=Description 真的非常好,也非常典型. https://discuss.leetcode.c ...
- [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 ...
- 2016年第七届蓝桥杯C/C++B组省赛题目解析
题目1:煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?请填 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
随机推荐
- (greedy)Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- debuggap,移动端调试新方式
最近发现了一个移动端调试的新技能,这里简单描述一下基本情况. 移动端调试常遇到的问题 手机访问只能看到页面的展现,除此之外看不到任何其他信息 无法像调试PC页面那么方便的查看js.dom.networ ...
- phpcms:三、头部包含
1‘标题:{if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO['site_title ...
- NetAnalyzer笔记 之 一. 开篇语
[创建时间:2015-08-26 22:00:12] NetAnalyzer下载地址 第一次写技术相关的博客,不足之处还请担待并告知. 在开始之前,先简单介绍一下NetAnalyzer, NetAna ...
- 用递归翻转一个栈 Reverse a stack using recursion
明白递归语句之前的语句都是顺序运行,而递归语句之后的语句都是逆序运行 package recursion; import java.util.Stack; public class Reverse_a ...
- CSS Gradient详解
啥也不说,先看代码: <style> div { width:100px;height:100px;border-radius:50px;/**第一行样式是设置容器的宽高,并且把圆角设置成 ...
- JAVA与JSON的序列化、反序列化
package com.linkage.app.memcache; import java.util.HashMap;import java.util.Map.Entry; import net.sf ...
- ASP.NET MVC4 + Highcharts生成报表
//后端 public ActionResult TighteningReport(BReportTighteningReportModel model, string rate, string we ...
- php 生成和下载xml文件
方法一 $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; $rootEle = $doc->create ...
- find the safest road--hdu1596
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...