labuladong双指针技巧秒杀七道数组题目

文章介绍了使用双指针技巧解决七道数组题目,包括快慢指针在删除有序数组中的重复项、删除排序链表中的重复元素、移除元素等问题,以及左右指针在寻找两数之和、反转字符串和找到最长回文子串等场景的应用。
摘要由CSDN通过智能技术生成

双指针技巧秒杀七道数组题目


一、快慢指针技巧

题目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;
    }
}

二、左右指针的常用算法

题目1:167. 两数之和 II - 输入有序数组

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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值