目录
问题
题目(共七道):
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;
}
680. 验证回文串 II-思路
用到贪心算法,代码写出来了,可以AC,但对贪心算法没有概念,刷到贪心的时候需要回看此题。
88. 合并两个有序数组思路
我思路:用双指针,为了使空间复杂度为O(1),讲num1和num2直接合并为num1,但是存在问题:num1部分元素被覆盖。
改进:观察可知,nums1的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1的最后面。
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();//判断目标串是否遍历完
}
}