22年第31周

目录

1.二分查找

2.移除元素

3.有序数组的平方

4.长度最小的子数组


打算从这一周开始,每周刷4道leetcode题,之后把题目链接复制到这里,并写下做完这道题的感想。

1.二分查找

题目链接:二分查找

有序不重复的数组中进行查找,可以利用二分查找,二分查找整个逻辑其实是比较简单的,麻烦的问题在怎么处理边界问题,就是你的边界是左闭右闭[a,b],还是左闭右开[a,b)。这些都是你自己决定的,这里定制好之后,将会决定你的while条件中边界怎么处理以及left和right怎么进行更新的问题。代码如下:

//我采用的是左闭右开的方式
func search(nums []int, target int) int {

    left := 0
    right := len(nums)//左闭右开区间

    for (left < right) {
        mid := left + (right - left)/2

        if nums[mid] == target {
            return mid
        }

        if nums[mid] > target {
            right = mid
            continue
        }

        left = mid + 1
    }
    return -1
}

2.移除元素

题目链接:移除元素

想法:这道题一看就是可以用快慢指针法进行解决,fast进行遍历整个数组,low指向下一个需要填充的位置。(当然暴力循环也能解决这个问题,不过不是一个比较好的解)代码如下。

func removeElement(nums []int, val int) int {

    fast := 0
    low := 0

    for fast < len(nums){

        if nums[fast] != val {
            nums[low] = nums[fast]
            low++
        }
        fast++

    }
    return low
}

3.有序数组的平方

题目链接:有序数组的平方

思路:两种思路,第一种先进行平方,再进行排序。第二种,利用双指针法,因为最大值肯定在数组的两头。

//import "sort"

//数组本身就是有顺序的,只不过顺序在最两边
func sortedSquares(nums []int) []int {
    results := make([]int,len(nums))
    i := 0
    j := len(nums)-1
    k := j
    for i<=j {
        if nums[i] * nums[i] < nums[j] * nums[j]{
            results[k] = nums[j] * nums[j]
            k--
            j--
        }else{
            results[k] = nums[i] * nums[i]
            k--
            i++
        }
    }
    return results
}

/*先平方,在排序
func sortedSquares(nums []int) []int {

    for i:=0;i<len(nums);i++{
        nums[i] = nums[i]*nums[i]
    }
    sort.Ints(nums)
    return nums
}
*/

4.长度最小的子数组

题目链接:长度最小的子数组

思想:这道题可以利用包利循环算法求解,同时这道题也有个更好的想法,就是滑动窗口法,使用两个指针指向窗口两端,当窗口中的和大于等于target时,就从左边的指针开始缩小窗口,并记录下最小的窗口值,直到窗口中的值小于target。代码如下:

func minSubArrayLen(target int, nums []int) int {

    left := 0
    right := 0//左闭右闭区间
    sum := nums[left]//滑动窗口中的值
    min := len(nums) + 10//最小长度记录

    for right < len(nums) {

        for sum >= target {//缩小窗口,找最小的min
            length := right - left + 1
            if length < min {
                min = length
            }
            sum -= nums[left]
            left++
        }

        if right == len(nums)-1{
            break
        }
        right++
        sum += nums[right]
    }
    if min == len(nums) + 10 {
        return 0
    }
    return min
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值