区块链技术博客
www.b2bchain.cn

双指针(左右夹逼,快慢指针,多指针)求职学习资料

本文介绍了双指针(左右夹逼,快慢指针,多指针)求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

双指针,是指用两个变量在线性结构上遍历而解决的问题。双指针算法是基于暴力解法的优化。

  • 对于数组,指两个变量在数组上相向移动解决的问题
  • 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题

1. LeetCode题目

类型 LeetCode题目
暴力循环 1.两数之和
左右指针夹逼 125.验证回文串、11.盛最多水的容器、15.三数之和、 18.四数之和
快慢指针 141.环形链表、202.快乐数

2. 暴力循环

leetCode 1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

var twoSum = function(nums, target) {   for (let i = 0; i < nums.length; i++ ) {     for(let j = i + 1; j < nums.length; j++ ) {       if (nums[i] + nums[j] === target) {         return [i, j]       }     }   } };

3. 左右指针夹逼

左右指针分别指向左右两端,根据情况向中间移动。适用于两数之和三数之和四数之和, 盛最多水的容器这样的LeetCode题目,先对数组进行排序,然后左右夹逼求值。

leetCode 125.验证回文串

var isPalindrome = function (str) {   str = str.replace(/[^0-9a-zA-Z]/g, '').toLowerCase()   let l = 0, r = str.length - 1 // 头尾指针   while (l < r) {      if (str[l] != str[r]) {       return false     }     l++     r--   }   return true }

LeetCode 11.盛最多水的容器

左右指针分别指向左右两端,总是移动数字较小的那个指针,得出最大值

const maxArea = height => {   let i = 0; // 左指针   let j = height.length - 1; // 右指针   let area = 0;   while(i < j) {     area = Math.max(Math.min(height[i], height[j]) * (j - i), area)     if (height[i] < height[j]) {       i++     } else {       j--     }   }   return area };

时间复杂度:O(n)

LeetCode 15.三数之和

枚举k,k确定后,让 nums[i] + nums[j] + nums[k] = 0
因为k右侧的数组始终是单调递增的,双指针i j一个在头,一个在尾。如果sum < 0, 左指针i往右移。如果sum > 0, 右指针j往左移
“`js
// -4 -1 -1 -1 0 1 2
// k i j
const threeSum = nums => {
let arr = []
nums = nums.sort()

for (let k = 0; k < nums.length – 2; k++) { if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k – 1]) continue; // 跳过重复的k值
let i = k + 1
let j = nums.length – 1

while (i < j) {   const sum = nums[k] + nums[i] + nums[j]   if (sum === 0) {     arr.push([nums[k], nums[i], nums[j]])     while(i < j && nums[i] === nums[++i]) {}

双指针,是指用两个变量在线性结构上遍历而解决的问题。双指针算法是基于暴力解法的优化。

  • 对于数组,指两个变量在数组上相向移动解决的问题
  • 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题

1. LeetCode题目

类型 LeetCode题目
暴力循环 1.两数之和
左右指针夹逼 125.验证回文串、11.盛最多水的容器、15.三数之和、 18.四数之和
快慢指针 141.环形链表、202.快乐数

2. 暴力循环

leetCode 1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

var twoSum = function(nums, target) {   for (let i = 0; i < nums.length; i++ ) {     for(let j = i + 1; j < nums.length; j++ ) {       if (nums[i] + nums[j] === target) {         return [i, j]       }     }   } };

3. 左右指针夹逼

左右指针分别指向左右两端,根据情况向中间移动。适用于两数之和三数之和四数之和, 盛最多水的容器这样的LeetCode题目,先对数组进行排序,然后左右夹逼求值。

leetCode 125.验证回文串

var isPalindrome = function (str) {   str = str.replace(/[^0-9a-zA-Z]/g, '').toLowerCase()   let l = 0, r = str.length - 1 // 头尾指针   while (l < r) {      if (str[l] != str[r]) {       return false     }     l++     r--   }   return true }

LeetCode 11.盛最多水的容器

左右指针分别指向左右两端,总是移动数字较小的那个指针,得出最大值

const maxArea = height => {   let i = 0; // 左指针   let j = height.length - 1; // 右指针   let area = 0;   while(i < j) {     area = Math.max(Math.min(height[i], height[j]) * (j - i), area)     if (height[i] < height[j]) {       i++     } else {       j--     }   }   return area };

时间复杂度:O(n)

LeetCode 15.三数之和

枚举k,k确定后,让 nums[i] + nums[j] + nums[k] = 0
因为k右侧的数组始终是单调递增的,双指针i j一个在头,一个在尾。如果sum < 0, 左指针i往右移。如果sum > 0, 右指针j往左移
“`js
// -4 -1 -1 -1 0 1 2
// k i j
const threeSum = nums => {
let arr = []
nums = nums.sort()

for (let k = 0; k < nums.length – 2; k++) { if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k – 1]) continue; // 跳过重复的k值
let i = k + 1
let j = nums.length – 1

while (i < j) {   const sum = nums[k] + nums[i] + nums[j]   if (sum === 0) {     arr.push([nums[k], nums[i], nums[j]])     while(i < j && nums[i] === nums[++i]) {}

双指针,是指用两个变量在线性结构上遍历而解决的问题。双指针算法是基于暴力解法的优化。

  • 对于数组,指两个变量在数组上相向移动解决的问题
  • 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题

1. LeetCode题目

类型 LeetCode题目
暴力循环 1.两数之和
左右指针夹逼 125.验证回文串、11.盛最多水的容器、15.三数之和、 18.四数之和
快慢指针 141.环形链表、202.快乐数

2. 暴力循环

leetCode 1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

var twoSum = function(nums, target) {   for (let i = 0; i < nums.length; i++ ) {     for(let j = i + 1; j < nums.length; j++ ) {       if (nums[i] + nums[j] === target) {         return [i, j]       }     }   } };

3. 左右指针夹逼

左右指针分别指向左右两端,根据情况向中间移动。适用于两数之和三数之和四数之和, 盛最多水的容器这样的LeetCode题目,先对数组进行排序,然后左右夹逼求值。

leetCode 125.验证回文串

var isPalindrome = function (str) {   str = str.replace(/[^0-9a-zA-Z]/g, '').toLowerCase()   let l = 0, r = str.length - 1 // 头尾指针   while (l < r) {      if (str[l] != str[r]) {       return false     }     l++     r--   }   return true }

LeetCode 11.盛最多水的容器

左右指针分别指向左右两端,总是移动数字较小的那个指针,得出最大值

const maxArea = height => {   let i = 0; // 左指针   let j = height.length - 1; // 右指针   let area = 0;   while(i < j) {     area = Math.max(Math.min(height[i], height[j]) * (j - i), area)     if (height[i] < height[j]) {       i++     } else {       j--     }   }   return area };

时间复杂度:O(n)

LeetCode 15.三数之和

枚举k,k确定后,让 nums[i] + nums[j] + nums[k] = 0
因为k右侧的数组始终是单调递增的,双指针i j一个在头,一个在尾。如果sum < 0, 左指针i往右移。如果sum > 0, 右指针j往左移
“`js
// -4 -1 -1 -1 0 1 2
// k i j
const threeSum = nums => {
let arr = []
nums = nums.sort()

for (let k = 0; k < nums.length – 2; k++) { if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k – 1]) continue; // 跳过重复的k值
let i = k + 1
let j = nums.length – 1

while (i < j) {   const sum = nums[k] + nums[i] + nums[j]   if (sum === 0) {     arr.push([nums[k], nums[i], nums[j]])     while(i < j && nums[i] === nums[++i]) {}

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 双指针(左右夹逼,快慢指针,多指针)求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们