[mermaid]graph TD
    A[Start: Two Pointer]
    A1[题号: 101, 102, 103]
    B[Search]
    B1[Binary Search]
    B1a[题号: 301, 302, 303]
    B2[DFS - Depth First Search]
    B2a[题号: 501, 502, 503]
    B3[BFS - Breadth First Search]
    B3a[题号: 601, 602, 603]
    C[Sort]
    C1[Bubble Sort]
    C1a[题号: 701, 702, 703]
    C2[Quick Sort]
    C2a[题号: 801, 802, 803]
    C3[Merge Sort]
    C3a[题号: 901, 902, 903]
    D[Greedy Algorithm]
    D1[题号: 1001, 1002, 1003]
    E[Divide and Conquer]
    E1[题号: 1101, 1102, 1103]
    F[DP - Dynamic Programming]
    F1[题号: 1201, 1202, 1203]

    A --> A1
    A --> B
    B --> B1
    B1 --> B1a
    B --> B2
    B2 --> B2a
    B --> B3
    B3 --> B3a
    B --> C
    C --> C1
    C1 --> C1a
    C --> C2
    C2 --> C2a
    C --> C3
    C3 --> C3a
    C --> D
    D --> D1
    D --> E
    E --> E1
    E --> F
    F --> F1 [/mermaid]

双指针

题号: 167 Two Sum II – Input Array Is Sorted

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/

题目描述

给定一个已按非递减顺序排列的整数数组numbers,请找出两个数,使它们相加之和等于特定目标数target。返回这两个数的索引(以1为起始索引),即numbers[index1]numbers[index2],其中1 <= index1 < index2 <= numbers.length

返回两个数字的索引,以长度为2的整数数组[index1, index2]的形式。测试用例保证有且仅有一个解决方案。不得使用相同元素两次。

您的解决方案只能使用恒定的额外空间。

我的要点笔记:

  1. 返还array 的语法是这样: return new int[] {l+1,r+1};,返还空array记得用new int [2].
  2. index要加1,因为他要的是第几位数而不是index

我的答案:

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int l = 0, r = numbers.length -1;
        while(l<r){
            int sum = numbers[l] + numbers[r];
            if(sum == target){
                return new int[] {l+1,r+1};
            }
            if( sum < target){
                l ++;
            }else{
                r--;
            }
        }
        return new int[2];
    }
}

更优答案:

(请在此处添加更优答案)


题号: 633 Sum of Square Numbers

https://leetcode.com/problems/sum-of-square-numbers/description/

题目描述

判断一个非负整数c是否为两个整数的平方和。换言之,是否存在两个整数ab,使得a^2 + b^2 = c

我的要点笔记:

  1. 使用Math.sqrt(target)作为初始r
  2. 因为涉及平方,使用long而不是int

我的答案:

class Solution {
    public boolean judgeSquareSum(int c) {
        long x =0, y = (long) Math.sqrt(c);
        while ( x <= y){
            long sum =x*x+y*y;
            if ( sum == c) return true;
            if (sum < c){
                x++;
            }else{
                y--;
            }
        }
        return false;
    }
}

更优答案:

(请在此处添加更优答案)


题号: 345 Reverse Vowels of a String

https://leetcode.com/problems/reverse-vowels-of-a-string/description/

题目描述

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

我的要点笔记:

  1. 用string或者hashset很快,储存vowels
  2. 可以用双while优化

我的答案:

class Solution {
    public String reverseVowels(String s) {
        String vowels = "AEIOUaeiou";
        int l = 0  , r = s.length()-1;
        char [] res = s.toCharArray();
        while(l < r){
            if(vowels.indexOf(s.charAt(l)) >= 0 &&vowels.indexOf(s.charAt(r)) >= 0){
                char temp = s.charAt(l);
                res[l] = res[r];
                res[r]=temp;
                l++;
                r--;
            }else if(vowels.indexOf(s.charAt(l)) < 0){
                l++;
            }else if(vowels.indexOf(s.charAt(r)) <0){
                r--;
            }
            
        }
        return new String(res);
    }
}

更优答案:

class Solution {
    public String reverseVowels(String s) {
        char[] word = s.toCharArray();
        int start = 0;
        int end = s.length() - 1;
        String vowels = "aeiouAEIOU";
        
        while (start < end) {
            // Move start pointer until it points to a vowel
            while (start < end && vowels.indexOf(word[start]) == -1) {
                start++;
            }
            
            // Move end pointer until it points to a vowel
            while (start < end && vowels.indexOf(word[end]) == -1) {
                end--;
            }
            
            // Swap the vowels
            char temp = word[start];
            word[start] = word[end];
            word[end] = temp;
            
            // Move the pointers towards each other
            start++;
            end--;
        }
        
        String answer = new String(word);
        return answer;
    }
}

题号: 680 Valid Palindrome II

https://leetcode.com/problems/valid-palindrome-ii/description/

题目描述

给定一个非空字符串s,最多删除一个字符。判断是否能成为回文字符串。

我的要点笔记:

  1. 我加了一个helper判断palindrome,然后一个boolean flag来判断是否可以移除一个字符
  2. 移除字符有两种情况,移除左边的或者右边的
  3. 大概是O(n)

我的答案:

class Solution {
    public boolean validPalindrome(String s) {
       return palindramHelper(s,true);

    }

    boolean palindramHelper(String s, boolean ifHasChance){
               int l = 0 , r = s.length()- 1;
       while( l <= r){
           if(s.charAt(l) == s.charAt(r)){
               l++;
               r--;
           }else{
                if(ifHasChance){
                    return palindramHelper(s.substring(l,r),false) || palindramHelper(s.substring(l+1,r+1),false);
                }else{
                    return false;
                }
           }
       } 
       return true;
    }
}

更优答案:

(请在此处添加更优答案)


题号: 88 Merge Sorted Array

https://leetcode.com/problems/merge-sorted-array/description/

题目描述

给你两个有序整数数组nums1nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。

初始化nums1nums2的元素数量分别为mn。你可以假设nums1有足够的空间(空间大小等于m + n)来保存nums2中的元素。

我的要点笔记:

  1. 从大到小排序
  2. 如果短的用尽了,可以判断退出因为肯定整个是sorted

我的答案:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int x  = m-1, y = n - 1 , i = m+n-1;
        while(y >= 0){
            if(x >=0 && nums1[x] > nums2[y]){
                nums1[i] = nums1[x];
                x--;
            }else{
                nums1[i] = nums2[y];
                y--;
            }
            i--;
        }
    }
}

更优答案:

(请在此处添加更优答案)


题号: 141 Linked List Cycle

https://leetcode.com/problems/linked-list-cycle/description/

题目描述

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回true。否则,返回false

我的要点笔记:

  1. 差速,一个快一个慢,注意查null

我的答案:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if( head == null)return false;
        ListNode list1= head;
        ListNode list2 =head.next;
        while ( list1 != null && list2 != null &&list1.next != null && list2.next!= null){
            if( list1==list2)return true;
            list1=list1.next;
            list2=list2.next == null? null : list2.next.next;
        }
        return false;
    }
}

更优答案:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        
        ListNode slow ,fast;
                if( head==null) return false;
        
        slow=head;
        fast=head.next;
        

        
        while(slow!=fast)  {
            
            if(fast==null || fast.next==null) return false;
            
            slow=slow.next;
            fast=fast.next.next;
        
            }
        
              return true;
     
        
    }
}

题号: 524 Longest Word in Dictionary through Deleting

https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/description/

题目描述

给定一个字符串s和一个字符串数组d。你需要从s中删除一些字符,使得它构成字符串列表d中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序中最小的字符串。

通过删除s中的一个字符能得到字符串t,可以认为ts的子序列,我们可以使用双指针来判断一个字符串是否为另一个字符串的子序列。

我的要点笔记:

  1. string对比大小用 curr.compareTo(res)
  2. 直接跳过不符合条件的string,比如过短

我的答案:

class Solution {
    public String findLongestWord(String s, List<String> dictionary) {
        String res = "";
        for(int i = 0 ; i < dictionary.size();  i++){
            String curr = dictionary.get(i);
            if(curr.length() < res.length()) continue;
            int l = 0 , r = 0;
            while (l < s.length() && r < curr.length()){
                if(s.charAt(l) == curr.charAt(r)){
                    r++;
                }
                l++;
            }
            if(r < curr.length())continue;
            if((curr.length() > res.length())||(res.length() == curr.length() &&  curr.compareTo(res) < 0)){
                res = curr;
            }
        }
        return res;
    }
}

更优答案:

(请在此处添加更优答案)


请根据您的需要在各部分填写相应的笔记和答案。如果您需要其他题目的信息,或有其他问题,随时告诉我!

Leave a Comment

Your email address will not be published. Required fields are marked *

Share the Post:

Related Posts

Barry的四月日记

出埃及的是我,不满意的也是我 最近那个有时候觉得自己对每天的生活还不是很满意,有一些焦虑, 但是有一天我意识到这是我曾经想象的觉得期待的生活,为何如今又觉得没有满足呢?有一些事情我当时是比较确信是神的带领,就连今天我也这样认为,但是为什么自己就是没有喜乐,没有能全然接受呢?就像神带领以色列出埃及,他们当时觉得有盼望,后来又后悔或者觉得没有盼望,我何尝不和他们一样软弱呢?我意识到自己已经在神所给我的道路,却没有足够的平安喜乐去走,左顾右盼,想象其他可能性以至于无法专注。我觉得可能需要一个过程吧,一次又一次知道神的旨意,也许就更加能走的稳。 神是真神,无论在哪 和一个很要好的弟兄好久没聊,聊天后发觉我们经历的是类似的阶段,神对我们的带领,与人相处的功课,都是如此的相似。神的话语使我们都渴慕他,我们相离很远,但看到神在不同的弟兄身上做一样的工,我心里感谢赞美他, 知道他真的带领我们,不是靠着某个教会或者某个牧师,而因着他是真理,他用放在我们心里的灵亲自带领我们。过去两年我思考教会和聚会的意义是什么,基督徒应该怎样生活。我大概有了70%的答案。现在的课题是我如何跟随神的旨意,如何爱人接纳他人。我和那位弟兄有着类似的阶段,感谢圣灵的带领让我清晰知道神你又真又活。 神说你是我的儿子 有一天我祷告的时候问神,你会如何带领我的未来,我静默,我脑海中出现了读过的一本书中所描述的场景,是我所向往的:5岁的男孩问父亲:“爸爸我是男子汉吗?” 父亲毫不犹豫的摸着他的头说:“儿子你是一个强大的男人” 就在这时候我的脑海中的画面角色互换,我竟然变成了那个孩子,是天父摸着我的头,肯定我说:“我的孩子你是一个强大的男人” 我很感动。我喜欢孩子,书中说你的孩子等待你肯定他的场景在一生中不会很多,但如果这时你有犹豫就可能错过认可他的宝贵机会,每个男人都渴望被父亲认可,那一刻非常重要。 还发日记吗? 发呗,写着玩。我还挺惊讶有很多朋友都说看过我的上一篇日记的,感谢大家关注。我从小喜欢互联网,小学就是qq群管理员了=v=,有一个个人网站的想法在我初中就有,那时候以为会很贵,现在我的这个网站基本不花钱,一年2刀的电费。每天刷社交媒体发现自己刷的短视频完全被算法控制,你看到的是他们想让你看到的,参与他们的游戏和在自己在个人网站的地盘的感觉还是有点不一样的,也算是在互联网的历史长河中有点参与感。我小时候想创网站,今天还是想搞网站,看来无意识中有些事情是会必然吸引你今生去做一次的,也许这也是神造我的一部分吧。

Read More

Where are you going (海龟男孩) —歌词

恐慌的人们 甜蜜时清醒遗忘的意义 随著死亡而坠落让强大 但有限的头脑作王这第一个谎言 轻易进入世间爱 已经成为过去的事那温暖 是被动的无私爱人 让我亲吻你的梦 该往哪走?往哪走?妈妈 爱人 往哪走?往哪走?爱人 兄弟 往哪走?往哪走?兄弟 主啊 该往哪走?往哪走?往哪走? 我们宁愿 绝望也不信自己的灵魂 没有内在的美德荣耀的君王 被钉死他乡用完全的义 担当我们的苦难爱

Read More

Join Our Newsletter