『Leetcode』双指针

问题

题目(共七道):
167. 两数之和 II - 输入有序数组
633.平方数之和
345.反转字符串中的元音字符
680. 验证回文串 II
88. 合并两个有序数组
141. 环形链表
524. 通过删除字母匹配到字典里最长单词

167. 两数之和 II - 输入有序数组-思路

作为双指针类型的母题。

167. 语法

java用到的是数组:int[] numbers,对应数组长度为numbers.length.
涉及java中length和length()的区别
c++用到容器vector<int>& numbers,对应长度为numbers.size()

633.平方数之和-思路

本题的关键是右指针的初始化,设右指针为 x,左指针固定为 0,为了使 0^2 + x*x 的值尽可能接近 target,我们可以将 x 取为 sqrt(target)。最多只需要遍历一次 0~sqrt(target),所以时间复杂度为 O(sqrt(target))。又因为只使用了两个额外的变量,因此空间复杂度为 O(1)。

633.语法

开根号函数:
Java:long right = (long) Math.sqrt(c);
c++:long right = (int)sqrt(c);

345.反转字符串中的元音字符-语法

java版:

 char[] arr = s.toCharArray();
 //String字符串变成char数组
public boolean isVowel(char ch) {
    
    
        return "aeiouAEIOU".indexOf(ch) >= 0;
    }

java中indexOf()函数的用法

680. 验证回文串 II-思路

用到贪心算法,代码写出来了,可以AC,但对贪心算法没有概念,刷到贪心的时候需要回看此题。

88. 合并两个有序数组思路

我思路:用双指针,为了使空间复杂度为O(1),讲num1和num2直接合并为num1,但是存在问题:num1部分元素被覆盖。
改进:观察可知,nums1的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1的最后面。

JAVA HashMap 和 HashSet 的区别

141. 环形链表

法1-哈希表:利用哈希表不能存在重复元素的特性。
法2-快慢指针:该题为快慢指针的经典母题。

524. 通过删除字母匹配到字典里最长单词

思路:将题目分解为两步:1. 找最长串;2. 判断t是否为s子串。
代码(java):

class Solution {
    
    
    public String findLongestWord(String s, List<String> dictionary) {
    
    
        //循环遍历目标串数组,查找符合条件的最大字串元素
        String longestWord="";

        
        for(String target:dictionary){
    
    

            //1. 找最长串
            int l1=longestWord.length(),l2=target.length();
            if(l1>l2 || (l1==l2 && longestWord.compareTo(target)<0)){
    
    
                continue;//如果当前最长串长度l1比较大or长度相同但字母列比较小,则仍然为当前字串元素为结果
            }

            //2. 判断是否为s子串
            if(vaildString(s,target)){
    
    
                longestWord=target;
            }
        }
        return longestWord;
    }

    public boolean vaildString(String s,String t){
    
    
        //判断字符串t是否为字符串s的子串
        int i=0,j=0;
        while(i<s.length() && j<t.length()){
    
    
            if(s.charAt(i)==t.charAt(j)){
    
    
                j++;
            }
            i++;
            //若果不相等,则目标串j不动,固定串s的下标i右移一位
        }
        return j==t.length();//判断目标串是否遍历完
    }
}

java compareTo()方法

猜你喜欢

转载自blog.csdn.net/JingYan_Chan/article/details/127568039
今日推荐