算法-雙指針


算法-雙指針

 

    心灰盡,有發未全僧。

 

簡介:算法-雙指針

一、和為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 }
View Code

 二、和為S 的連續正數序列

1、題目描述

輸出所有和為 S 的連續正數序列。例如和為 100 的連續序列有:

[9, 10, 11, 12, 13, 14, 15, 16] [18, 19, 20, 21, 22]

2、解題思路

前綴和

對於求一個區間和,一貫的優化技巧是使用前綴和。比如:
圖片說明
sum[i]表示前i個數的和。比如sum[1] = 1,表示前一個數的和為1sum[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 }
View Code

 三、翻轉單詞順序列

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 }
View Code

 四、左旋轉字符串

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 }
View Code

 

 

 

 

 

      心灰盡

有發未全僧

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM