日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode——双指针

發(fā)布時間:2024/2/28 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode——双指针 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

雙指針

雙指針主要用來遍歷數(shù)組,兩個指針指向不同的元素,從而協(xié)同完成任務(wù)。


目錄

  • 有序數(shù)組的 Two Sum
  • 兩數(shù)平方和
  • 反轉(zhuǎn)字符串中的元音字符
  • 回文字符串
  • 歸并兩個有序數(shù)組
  • 判斷鏈表是否存在環(huán)
  • 最長子序列

  • 1. 有序數(shù)組的 Two Sum


    題目描述:在有序數(shù)組中找出兩個數(shù),使它們的和為 target。

    使用雙指針,一個指針指向值較小的元素,一個指針指向值較大的元素。指向較小元素的指針從頭向尾遍歷,指向較大元素的指針從尾向頭遍歷。

    • 如果兩個指針指向元素的和 sum == target,那么得到要求的結(jié)果;
    • 如果 sum > target,移動較大的元素,使 sum 變小一些;
    • 如果 sum < target,移動較小的元素,使 sum 變大一些;
  • java版
  • public int[] twoSum(int[] numbers, int target) {int i = 0, j = numbers.length - 1;while (i < j) {int sum = numbers[i] + numbers[j];if (sum == target)return new int[]{i + 1, j + 1};else if (sum > target)j--;elsei++;}return null;}
  • go版
  • func twoSum(nums []int, target int) []int {m := make(map[int]int)for i, num := range nums {diff := target - numif _, ok := m[diff]; ok {return []int{m[diff], i}}m[num] = i}return nil }

    2. 兩數(shù)平方和


    題目描述:判斷一個數(shù)是否為兩個數(shù)的平方和。

  • java
  • public boolean judgeSquareSum(int C) {int i = 0, j = (int) Math.sqrt(C);while (i <= j) {int sum = i * i + j * j;if (sum == C)return true;else if (sum < C)i++;elsej--;}return false;}
  • go版
  • func judgeSquareSum(c int) bool {i, j := 0, int(math.Sqrt(float64(c)))for i <= j {target := i*i + j*jif target == c {return true} else if target < c {i++} else if target > c {j--}}return false }

    3. 反轉(zhuǎn)字符串中的元音字符


    使用雙指針指向待反轉(zhuǎn)的兩個元音字符,一個指針從頭向尾遍歷,一個指針從尾到頭遍歷。

  • java
  • private final static HashSet<Character> vowels =new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));public String reverseVowels(String s) {int i = 0, j = s.length() - 1;char[] result = new char[s.length()];while (i <= j) {char ci = s.charAt(i);char cj = s.charAt(j);if (!vowels.contains(ci)) {result[i++] = ci;} else if (!vowels.contains(cj)) {result[j--] = cj;} else {result[i++] = cj;result[j--] = ci;}}return new String(result);}
  • go
  • func reverseVowels(s string) string {b := []byte(s)for i, j := 0, len(b)-1; i < j; {if isVowels(b[i]) && isVowels(b[j]) {b[i], b[j] = b[j], b[i]i++j--} else if !isVowels(b[i]) && isVowels(b[j]) {i++} else if isVowels(b[i]) && !isVowels(b[j]) {j--} else {i++j--}}return string(b) }func isVowels(s byte) bool {if s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' || s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U' {return true}return false }

    4. 回文字符串


    題目描述:刪除一個字符,判斷是否能構(gòu)成回文字符串。

  • java
  • public boolean volidPalindrome(String s) {for (int i = 0, j = s.length() - 1; i < j; i++, j--) {if (s.charAt(i) != s.charAt(j)) {return isPalindrome(s, i + 1, j) || isPalindrome(s, i, j - 1);}}return true;}private boolean isPalindrome(String s, int i, int j) {while (i < j) {if (s.charAt(i++) != s.charAt(j--)) {return false;}}return true;}
  • go
  • func validPalindrome(s string) bool {b := []byte(s)for i, j := 0, len(b)-1; i <= j; {if b[i] == b[j] {i++j--} else if b[i] != b[j] {return isPal(b, i+1, j) || isPal(b, i, j-1)}}return true }func isPal(b []byte, i int, j int) bool {for i<=j{if b[i]==b[j]{i++j--}else {return false}}return true }

    5. 歸并兩個有序數(shù)組


    題目描述:把歸并結(jié)果存放到第一個數(shù)組上。

    思路:需要從尾到頭遍歷,否則在 num1 上歸并得到的值會覆蓋還未進行歸并比較的值。

  • java
  • public void merge(int[] num1, int m, int[] num2, int n) {int index1 = m - 1, index2 = n - 1;int indexMerge = m + n - 1;while (index1 >= 0 || index2 >= 0) {if (index1 < 0) {num1[indexMerge--] = num2[index2--];} else if (index2 < 0) {num1[indexMerge--] = num1[index1--];} else if (num1[index1] > num2[index2]) {num1[indexMerge--] = num1[index1--];} else {num1[indexMerge--] = num2[index2--];}}}
  • go
  • func merge(nums1 []int, m int, nums2 []int, n int) {for i, j, tail := m-1, n-1, m+n-1; i >= 0 || j >= 0; tail-- {var cur intif i == -1 {cur = nums2[j]j--} else if j == -1 {cur = nums1[i]i--} else if nums1[i] > nums2[j] {cur = nums1[i]i--} else {cur = nums2[j]j--}nums1[tail] = cur} }

    6. 判斷鏈表是否存在環(huán)


    思路:使用雙指針,一個指針每次移動一個節(jié)點,一個節(jié)點每次移動兩個節(jié)點,如果存在環(huán),那么這兩個指針一定會相遇。

  • java
  • public boolean hasCycle(ListNode head) {if (head == null)return false;ListNode l1 = head;ListNode l2 = head;while (l1 != null && l2 != null && l2.next != null) {if (l1 == l2)return true;l1 = l1.next;l2 = l2.next.next;}return false;}
  • go
  • func hasCycle(head *ListNode) bool {fast ,slow := head,headfor slow!=nil &&fast!=nil && fast.Next!=nil{fast = fast.Next.Nextslow = slow.Nextif fast==slow{return true}}return false }

    7. 最長子序列


    題目描述:刪除 s 中的一些字符,使得它構(gòu)成字符串列表 d 中的一個字符串,找到能構(gòu)成的最長字符串。如果有多個相同長度的結(jié)果,返回字典的最小字符串。

    思路:通過刪除字符串 s 中的一個字符能得到字符串 t,可以認為 t 是 s 的子序列,我們可以使用雙指針來判斷一個字符串是否為另一個字符串的子序列。

  • java
  • public String findLongestWord(String s, List<String> d) {String longestWord = "";for (String target : d) {int l1 = longestWord.length(), l2 = target.length();if (l1 > l2 || (l1 == l2 && longestWord.compareTo(target) < 0)) {continue;}if (isSubstr(s, target)) {longestWord = target;}}return longestWord;}private boolean isSubstr(String s, String target) {int i = 0, j = 0;while (i < s.length() && j < target.length()) {if (s.charAt(i) == target.charAt(j)) {j++;}i++;}return j == target.length();}
  • go
  • func findLongestWord(s string, d []string) string {longestWord := "" // 記錄當前最長字符串for _, target := range d { // 獲取每一個目標字符串i, j := len(longestWord), len(target)if i > j || (i == j && strings.Compare(longestWord, target) < 0) { //如果當前最長字符串大于目標字符串或者兩者長度相等,但內(nèi)容不一樣,continuecontinue}if isSubstr(s, target) { //判斷是否是子串,如果是,更新reslongestWord = target}}return longestWord }func isSubstr(s, target string) bool {i, j := 0, 0for i < len(s) && j < len(target) { // 遍歷,但不能超過最長長度if s[i] == target[j] { //如果兩者字符相等,j++j++}i++ // 往下遍歷}return j == len(target) }

    總結(jié)

    以上是生活随笔為你收集整理的LeetCode——双指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。