算法思想
双指针
2021.3.2 – 2021.3.6
141.881.344.27.167.633.345.680.88.524
双指针思想适用于①左右双指针:。
②快慢双指针:判断是否有环
③滑动窗口
141. 环形链表
问题
思路
①快慢双指针,有环两者就能相遇。
public boolean hasCycle(ListNode head) {
if(head == null || head.next==null){
return false;
}
ListNode s = new ListNode(-1);
ListNode f = new ListNode(-1);
s = head;
f = head;
while(f !=null && f.next!=null){
s = s.next;
f = f.next.next;
if(s == f){
return true;
}
}
return false;
}
881. 救生艇
问题
思路
先排序,双指针,最大的和最小的相加,如果最重的人可以与最轻的人共用一艘船,那么就这样安排。否则,最重的人无法与任何人配对,那么他们将自己独自乘一艘船。
public int numRescueBoats(int[] people, int limit) {
//先排序
Arrays.sort(people);
int res = 0;
int i = 0, j = people.length-1;
while(i<=j){
if(people[i] + people[j] <= limit){
i++;
}
res++;
j--;
}
return res;
}
344. 反转字符串
问题
思路
原地修改,两个指针分别指向头尾,交换位置
public void reverseString(char[] s) {
int l = 0,r = s.length-1;
while(l<r){
char tmp = s[l];
s[l] = s[r];
s[r] = tmp;
l++;
r--;
}
}
27. 移除元素
问题
思路
原地移除且不考虑新长度后面的元素,可以将val元素移动到数组尾,需要双指针,一个遍历数组,一个从数组尾指向val移向的位置
https://blog.youkuaiyun.com/u012910051/article/details/110204289
167. 两数之和 II - 输入有序数组
问题
代码
public int[] twoSum(int[] numbers, int target) {
int l = 0,r = numbers.length-1;
while(l<r){
if(numbers[l]+numbers[r]==target){
return new int[]{
l+1,r+1};
}else if(numbers[l]+numbers[r]<target){
l++;
}else{
r--;
}
}
return new int[]{
};
}
633. 平方数之和
问题
思路
1.a 和 b一定小于根号c,找到中间值,双指针一个指向头,另一个指向中间值
public boolean judgeSquareSum(int c) {
int l= 0,r;
r = (int)Math.sqrt(c);
while(l<=r){
if(Math.pow(l,2)+Math.pow(r,2)<c){
l++;
}else if(Math.pow(l,2)+Math.pow(r,2)>c){
r--;
}else {
return true;
}
}
return false;
}
- 在枚举 a 之后,我们也可以直接使用 sqrt 函数直接找出 b。
时间复杂度:O(sqrt{
c})
空间复杂度:O(1)。
public boolean judgeSquareSum(int c) {
for (long a = 0; a * a <= c; a++) {
double b = Math.sqrt(c - a * a);
if (b == (int) b)
return true;
}
return false;
}
345. 反转字符串中的元音字母
问题
思路
头尾双指针,要注意元音字母大小写共10个.因为
String
是不可变量,所以用StringBuffer
或者将s转成数组
public String reverseVowels(String s) {
if(s==null ||s.length()==0){
return "";
}
StringBuffer sb = new StringBuffer(s);
String yu = "aeiouAEIOU";
char ll,rr;
int l = 0,r = s.length()-1;
while(l<r){
ll = sb.charAt(l);
rr = sb.charAt(r);
if(yu.indexOf(ll)!=-1){
while(yu.indexOf(rr)==-1){
r--;
rr = sb.charAt(r)