目录
打算从这一周开始,每周刷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
}