funcsearch(nums []int, target int)int { i, j := 0, len(nums)-1 for i <= j { m := i + (j-i)/2 if nums[m] < target { i = m + 1 } elseif nums[m] > target { j = m - 1 } else { return m } } return-1 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { publicintsearch(int[] nums, int target) { intlen= nums.length; for (inti=0, j = len-1; i <= j; ) { intk= i + (j-i)/2; if (nums[k] == target) { return k; } elseif (nums[k] < target) { i = k + 1; } else { j = k - 1; } } return -1; } }
funcsearchRange(nums []int, target int) []int { l, r := getLeft(nums, target), getRight(nums, target) if l == -2 || r == -2 { return []int{-1, -1} } if r - l > 1 { return []int{l+1, r-1} } return []int{-1, -1} }
funcgetLeft(nums []int, target int)int { res := -2 i, j := 0, len(nums)-1 for i <= j { m := i + (j-i)/2 if nums[m] < target { i = m + 1 } else { j = m - 1 res = j } } return res }
funcgetRight(nums []int, target int)int { res := -2 i, j := 0, len(nums)-1 for i <= j { m := i + (j-i)/2 if nums[m] > target { j = m - 1 } else { i = m + 1 res = i } } return res }
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。这个题目暴力解法就是两层 for 循环,一个 for 循环遍历数组元素,第二个 for 循环更新数组。
使用快慢指针可以在一个 for 循环下完成两个 for 循环的工作:
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新新数组下标的位置
1 2 3 4 5 6 7 8 9 10 11
funcremoveElement(nums []int, val int)int { slow, fast := 0, 0 for fast < len(nums) { if nums[fast] != val { nums[slow] = nums[fast] slow++ } fast++ } return slow }
给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。
实现滑动窗口,主要确定如下三点:
窗口内是什么?
如何移动窗口的起始位置?(本题使用 for 循环一次移动多位)
如何移动窗口的结束位置?(本题一次移动一位)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funcminSubArrayLen(target int, nums []int)int { res := len(nums) + 1 l, r, sum := 0, 0, 0 for r < len(nums) { sum += nums[r] for sum >= target { if res > (r - l + 1) { res = r - l + 1 } sum -= nums[l] l++ } r++ } if res == len(nums) + 1 { return0 } return res }
funcgenerateMatrix(n int) [][]int { top, bottom := 0, n-1 left, right := 0, n-1 num := 1 tar := n * n matrix := make([][]int, n) for i := 0; i < n; i++ { matrix[i] = make([]int, n) } for num <= tar { for i := left; i <= right; i++ { matrix[top][i] = num num++ } top++ for i := top; i <= bottom; i++ { matrix[i][right] = num num++ } right-- for i := right; i >= left; i-- { matrix[bottom][i] = num num++ } bottom-- for i := bottom; i >= top; i-- { matrix[i][left] = num num++ } left++ } return matrix }