双指针技巧秒杀七道数组题目
一、快慢指针技巧
题目1: 26. 删除有序数组中的重复项
class Solution {
public int removeDuplicates(int[] nums) {
//使用快慢指针
int slow = 0;
int fast = 0;
while (fast < nums.length){
if (nums[slow] != nums[fast]){
slow ++;
nums[slow] = nums[fast];
}
fast++;
}
return slow+1;
}
}
题目2: 83. 删除排序链表中的重复元素
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//使用快慢指针去重
if (head == null) return null;
ListNode slow = head;
ListNode fast = head;
while(fast != null){
if (fast.val != slow.val){
slow.next =fast;
slow = slow.next;
}
fast = fast.next;
}
slow.next = null;
return head;
}
}
题目3:27. 移除元素
class Solution {
public int removeElement(int[] nums, int val) {
//使用快慢指针
int slow = 0;
int fast = 0;
while(fast < nums.length ){
if (nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
二、左右指针的常用算法
class Solution {
public int[] twoSum(int[] numbers, int target) {
//考虑左右双指针
int left = 0;
int right = numbers.length - 1;
while (left < right){
if (numbers[left] + numbers[right] == target){
//注意如何返回数组!
return new int[]{left+1,right+1};
}
else if (numbers[left] + numbers[right] < target){
left++;
}
else if (numbers[left] + numbers[right] > target){
right--;
}
}
return new int[]{-1,-1};
}
}
题目2:344. 反转字符串
class Solution {
public void reverseString(char[] s) {
//经典例题:如何反转字符串——>左右指针
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
//交换
left++;
right--;
}
}
}
题目3:5. 最长回文子串
首先明确一下,回文串就是正着读和反着读都一样的字符串。
比如说字符串 aba 和 abba 都是回文串,因为它们对称,反过来还是和本身一样;反之,字符串 abac 就不是回文串。
中心双指针扩散方法
注意此题还有多种解法(暴力、动态规划、中心双指针扩散)
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
public int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
--left;
++right;
}
return right - left - 1;
}
}