双指针(JavaScript)

1.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题

 解题思路:根据题目意思写代码就好了

以下分享两种写法

var sortedSquares = function(nums) {
// nums.forEach((item,index) => nums[index] = item * item)
// nums.sort((a,b) => a-b)

    for(let i = 0; i < nums.length; i++){
        nums[i] = nums[i] * nums[i]
    }
    for(let i = 0; i < nums.length - 1; i++){
        for(let j = 0; j < nums.length - i - 1; j++){
            if(nums[j] > nums[j + 1]){
                const temp = nums[j+1]
                nums[j+1] = nums[j]
                nums[j] = temp
            }
        }
    }
    return nums
};

2. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]

输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]

输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

解题思路:

定义两根指针指向数组的开头

遍历数组判断右指针的数是否为0,如果不是就跟左指针的数交换 并且左指针右移一个步长

每次遍历右指针步长都+1,遍历完的数组就是答案

    var moveZeros = function (nums) {
        let left = 0,right = 0
        for(let i = 0; i < nums.length; i++){
            if(nums[right] !== 0){
                const temp = nums[right]
                nums[right] = nums[left]
                nums[left] = temp
                left++
            }
            right++
        }
        return nums
    }

 3.链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

 

 

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。 

提示:

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100

解题思路:使用都指向头节点的快慢指针,slow步长为1,fast步长为2,当fast,以及fast指向的下一个节点不为空两根指针才移动,直到不能移动slow所指向的就是中间节点

    var middNode = function(head){
        let slow = fast = head
        while(fast && fast.next){
            slow = slow.next
            fast = fast.next.next
        }
        return slow
    }

 4.删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5] 

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

解题思路: 创建一个虚拟节点指向头节点,定义两根指针(slow,fast)指向这个虚拟节点,先让fast移动n次,如果fast的下一个节点还存在就让两根指针都移动,直到fast下一个节点不存在。此时删除slow所指向的节点(建议画图描述该过程)

    var removeNthFromEnd = function(head,n){
        let dummy = new ListNode()
        dummy.next = head
        let slow = dummy
        let fast = dummy
        for(let i = 0; i < n; i++){
            fast = fast.next
        }
        while(fast.next !== null){
            slow = slow.next
            fast = fast.next
        }
        //删除节点
        slow.next = slow.next.next
        return dummy.next
    }
来源:力扣官网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号三;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值