-
算法-双指针
简介:算法-双指针
一、和为S 的两个数字
1、题目描述
在有序数组中找出两个数,使得和为给定的数 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。
2、解题思路
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
- 如果两个指针指向元素的和 sum == target,那么这两个元素即为所求。
- 如果 sum > target,移动较大的元素,使 sum 变小一些;
- 如果 sum < target,移动较小的元素,使 sum 变大一些。
3、代码示例
1 import java.util.ArrayList;
2 public class Solution {
3 public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
4 ArrayList<Integer> list = new ArrayList<>();
5 int i = 0;
6 int j = array.length - 1;
7 while(i < j){
8 if(array[i] + array[j] == sum){
9 list.add(array[i]);
10 list.add(array[j]);
11 break;
12 }else if(array[i] + array[j] < sum){
13 i++;
14 }else{
15 j--;
16 }
17 }
18 return list;
19 }
20 }
二、和为S 的连续正数序列
1、题目描述
输出所有和为 S 的连续正数序列。例如和为 100 的连续序列有:
[9, 10, 11, 12, 13, 14, 15, 16]
[18, 19, 20, 21, 22]
2、解题思路
前缀和
对于求一个区间和,一贯的优化技巧是使用前缀和。比如:
sum[i]表示前i个数的和。比如sum[1] = 1
,表示前一个数的和为1
,sum[2] = 3
, 表示前2
个数的和为3。
现在我们要求区间[2,4]
表示求第2,3,4
个数的和,就等于sum[4] - sum[1] = 9
在代码中用一个变量来模拟这个前缀和。
1 import java.util.ArrayList;
2 public class Solution {
3 public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
4 ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
5 for(int i = 1; i < sum; i++){
6 int temp = 0;
7 int j = i;
8 while(temp < sum){
9 temp += j;
10 j++;
11 }
12 if(temp == sum){
13 // 满足条件则拼装数据
14 ArrayList<Integer> list = new ArrayList<Integer>();
15 for(int k = i; k < j; k++){
16 list.add(k);
17 }
18 result.add(list);
19 }
20 }
21 return result;
22 }
23 }
三、翻转单词顺序列
1、题目描述
Input:
"I am a student."
Output:
"student. a am I"
2、解题思路
借助一些Java 自带的API 就很容易实现。
1 import java.util.*;
2
3 public class Solution {
4 public String ReverseSentence(String str) {
5 String[] split = str.split(" ");
6 List<Object> list = new ArrayList<>();
7 StringBuilder sb = new StringBuilder();
8 for(int i = 0; i < split.length; i++){
9 list.add(split[i]);
10 }
11 Collections.reverse(list); // 借助集合翻转API
12 Iterator<Object> iterator = list.iterator();
13 while (iterator.hasNext()){
14 sb.append(iterator.next()).append(" ");
15 }
16 return sb.toString().trim(); // 除去最后一个append 加上去的空格
17 }
18 }
四、左旋转字符串
1、题目描述
将字符串 S 从第 K 位置分隔成两个子字符串,并交换这两个子字符串的位置。
Input:
S="abcXYZdef"
K=3
Output:
"XYZdefabc"
2、解题思路
使用Java API 的substring 就很简单了。
1 public class Solution {
2 public String LeftRotateString(String str, int n) {
3 int length = str.length();
4 if(n > length){
5 return "";
6 }
7 String substring1 = str.substring(0, n); // substring 左闭右开
8 String substring2 = str.substring(n);
9 return substring2 + substring1;
10 }
11 }
出处:https://www.cnblogs.com/taojietaoge/p/15007898.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数