第一天:最长递增子序列(第一版)
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
}