打卡(坚持365)

第一天:最长递增子序列(第一版)

package main

import "fmt"

func main() {
	fmt.Println(LIS([]int{2,1,5,3,6,4,8,9,7}))
}

func LIS( arr []int ) []int {
	if len(arr) <=1 {
		return arr
	}
	res := make([]int,len(arr))
	res[0] = 1
	var value int
	for i,j:=1,0; i<len(arr); i++ {
		if arr[i] >arr[j] {
			res[i] = res[j]+1
		} else if arr[i]<arr[j]{
			for v:=j-1; v>=0; v-- {
				if arr[i]>arr[v] {
					res[i] = res[v]+1
					break
				}
			}
		}
		if res[i] == 0 {
			res[i] = 1
		}
		if res[i] >value {
			value = res[i]
		}
		j++
	}
	result := make([]int, value)
	var ok bool
	for n:=len(res)-1;n>=0;n--{
		if !ok {
			if res[n] == value {
				result[value-1] = arr[n]
				ok = true
			}
		} else {
			if res[n] < value {
				result[value-2] = arr[n]
				value--
			}
		}
		if value<1 {
			break
		}

	}
	return result
}

NC134 买股票的最好时机(二)

2021年11月26日

func maxProfit(prices []int) int {
	if len(prices) <= 0 {
		return 0
	}
	res := make([]int,0)
	current := prices[0]
	ans := 0
	for j:=1; j<len(prices); j++ {
		if prices[j] > current && prices[j]-current>ans {
			ans = prices[j]-current
		} else {
			res = append(res,ans)
			current = prices[j]
			ans = 0
		}
	}
	if ans != 0 {
		res = append(res,ans)
	}
	return sum(res)
}

func sum(res []int) int {
	var val int
	for i:=0; i<len(res); i++ {
		val+=res[i]
	}
	return val
}

 NC19:连续子数组的最大和

2021年11月29日

思路:res记录每个位置的最大值

func FindGreatestSumOfSubArray( array []int ) int {
	res := make([]int,len(array))
	if len(array)==0 {
		return 0
	}
	res[0]=array[0]
	for i:=1;i<len(array);i++ {
		if res[i-1]+array[i]>=array[i]{
			res[i]=res[i-1]+array[i]
		} else {
			res[i]=array[i]
		}
	}
	ans:=res[0]
	for j:=0;j<len(res);j++{
		if res[j]>ans{
			ans=res[j]
		}
	}
	return ans
}

NC144:不相邻最大子序列之和 

2021年11月29日

思路:res保存每个位置可以返回的最大值

func subsequence( n int ,  array []int ) int64 {
	res := make([]int,n)
	if n==0 {
		return 0
	} else if n==1 {
		res[0] = max(0,array[0])
		return int64(res[0])
	} else if n ==2 {
		res[1] = max(res[0],array[1])
		return int64(res[1])
	} else {
		res[0] = max(0,array[0])
		res[1] = max(res[0], array[1])
	}
	for i:=2;i<n;i++ {
		res[i] = max(array[i]+res[i-2],res[i-1])
	}
	return int64(res[n-1])
}
func max(a,b int) int {
	if a>b {
		return a
	} else {
		return b
	}
}

NC119: 最小的k个数

2021年11月30日

思路:快速排序(分而治之)

func GetLeastNumbers_Solution( input []int ,  k int ) []int {
	if len(input) == 0 || k == 0 {
		return []int{}
	}
	QuickSort(input)
	return input[:k]
}

func QuickSort(array []int){
	if len(array)<=1{
		return
	}
	l,r := 0,len(array)-1
	pivot := array[0]
	var ok bool
	for l<r{
		if !ok {
			if array[r]<pivot {
				array[l] = array[r]
				l++
				ok = true
				continue
			}
			r--
		} else {
			if array[l]>pivot {
				array[r] = array[l]
				r--
				ok = false
				continue
			}
			l++
		}
	}
	array[l]=pivot
	QuickSort(array[:l])
	QuickSort(array[l+1:])
}

NC88:寻找第K大

2021年11月30日

思路:快速排序

func findKth( a []int ,  n int ,  K int ) int {
	QuickSort(a)
	count := 1
	base := a[0]
	for i:=1;count<K;i++{
		if a[i]<base{
			count++
			base = a[i]
		}
	}
	return base
}

func QuickSort(a []int){
	if len(a)<=1 {
		return
	}
	l,r := 0,len(a)-1
	pivot:=a[0]
	var ok bool
	for l<r{
		if !ok {
			if pivot<a[r]{
				a[l]=a[r]
				l++
				ok = true
				continue
			}
			r--
		} else {
			if pivot>a[l]{
				a[r]=a[l]
				r--
				ok = false
				continue
			}
			l++
		}
	}
	a[l]=pivot
	QuickSort(a[:l])
	QuickSort(a[l+1:])
}

NC55:最长公共前缀

2021年11月30日

思路:遍历

func longestCommonPrefix( strs []string ) string {
	if len(strs)==0{
		return ""
	}
	if len(strs)==1 {
		return strs[0]
	}
	var ans string
	fir := strs[0]
	for i:=0;i<len(fir);i++{
		pivot := fir[i]
		for j:=1;j<len(strs);j++{
			if i>=len(strs[j]) {
				return ans
			}
			if pivot == strs[j][i] {
				continue
			} else {
				return ans
			}
		}
		ans += string(pivot)
	}
	return ans
}

NC74:数字在升序数组中出现的次数

2021年11月30日

思路:二分查找

func GetNumberOfK( data []int ,  k int ) int {
	// write code here
	if len(data)==0{
		return 0
	}
	l,r := 0,len(data)-1
	var key,value,count int
	var ok bool
	for l<=r {
		mid := (l+r)/2
		if data[mid]<k {
			l = mid+1
			continue
		} else if data[mid]>k{
			r = mid
		} else {
			key = mid
			value = data[mid]
			count=1
			break
		}
		if ok {
			break
		}
		if l==r {
			ok = true
		}
	}
	for i:=key-1;i>=0;i--{
		if data[i]==value{
			count++
			continue
		}
		break
	}
	for j:=key+1;j<len(data);j++{
		if data[j]==value{
			count++
			continue
		}
		break
	}
	return count
}

NC77:调整数组顺序使奇数位于偶数前面(一)

2021年11月30日

思路:合并

func reOrderArray( array []int ) []int {
	// write code here
	res := make([]int, 0)
	tmp := make([]int, 0)
	for i:=0; i<len(array); i++ {
		if array[i]%2 == 0{
			tmp = append(tmp, array[i])
		} else {
			res = append(res, array[i])
		}
	}
	for j:=0;j<len(tmp); j++ {
		res = append(res, tmp[j])
	}
	return res
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值