【双指针】——左、右指针
发布日期:2021-05-07 21:20:24 浏览次数:17 分类:精选文章

本文共 1791 字,大约阅读时间需要 5 分钟。

  • 左右指针在数组中实际是指两个索引值, 初始化为 left = 0, right =nums.length - 1 。

二分搜索

int binarySearch(int[] nums, int target) {   	int left = 0;	int right = nums.length - 1;	while(left <= right) {   		int mid = (right + left) / 2;		if(nums[mid] == target)			return mid;		else if (nums[mid] < target)			left = mid + 1;		else if (nums[mid] > target)			right = mid - 1;	} 	return -1;}

两数之和

只要数组有序, 就应该想到双指针技巧

int[] twoSum(int[] nums, int target) {   	int left = 0, right = nums.length - 1;	while (left < right) {   		int sum = nums[left] + nums[right];		if (sum == target) {   		// 题要求的索引是从 1 开始的		return new int[]{   left + 1, right + 1};		} else if (sum < target) {   			left++; // 让 sum 大一点		} else if (sum > target) {   			right--; // 让 sum小一 点		}	} 	return new int[]{   -1, -1};}

哈希表

//方法二        //使用了hashMap,降低了时间复杂度,时间复杂度为O(n)        HashMap
map = new HashMap<>();//用一个hashMap储存值和值的下标,如果map中不包含该数值则把数值压入map中,包含的话直接返回 for (int i = 0; i < nums.length; i++) { if (map.containsKey(target - nums[i])){ return new int[]{ map.get(target - nums[i]),i}; } map.put(nums[i],i); } return null;

反转数组

void reverse(int[] nums) {   	int left = 0;	int right = nums.length - 1;	while (left < right) {   		// swap(nums[left], nums[right])		int temp = nums[left];		nums[left] = nums[right];		nums[right] = temp;		left++; right--;	}}

反转链表

public ListNode reverseList(ListNode head) {           ListNode cur = head,pre = null;        while (cur != null){               ListNode tmp = cur.next;    //  缓存后继节点 cur.next            cur.next = pre;             //修改next引用指向            pre = cur;                  //pre暂存cur            cur = tmp;                  //cur访问下一个节点        }        return pre;    }

滑动窗口法

实际上是快慢指针在数组上的应用,可以解决一大类字符串匹配的问题

上一篇:剑指 Offer 36. 二叉搜索树与双向链表——DFS
下一篇:LeetCode - 1750. 删除字符串两端相同字符后的最短长度——左右指针

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月27日 11时11分15秒