兩道題目,限時一小時,從零到一完全實現。
第一題:https://leetcode-cn.com/problems/kth-missing-positive-number/
第二題:https://leetcode-cn.com/problems/profitable-schemes/
題目一:
n張卡片,無重復值,升序排列,想知道從第一張卡片的值開始第k個在卡片中未出現的正整數為多少,並進行返回
輸入輸出:
func main() {
T, nArr, kArr, ans := ReadData1()
res := make([]int,0)
for i:=0;i<T;i++{
tmp := solve1(nArr[i],kArr[i],ans[i])
res = append(res, tmp)
}
for i:=0;i<(len(res));i++{
fmt.Println(res[i])
}
}
func ReadData1()(int, []int, []int, [][]int){
var (
T int
n,k int
tmp int
ans [][]int
)
fmt.Scanln(&T)
nArr, kArr := make([]int,T),make([]int,T)
for i:=0;i<T;i++{
fmt.Scanln(&n, &k)
nArr[i] = n
kArr[i] = k
res := make([]int,n,n)
for j :=0;j<n;j++{
fmt.Scan(&tmp)
res[j] = tmp
}
ans = append(ans, res)
}
fmt.Println(ans,T,nArr,kArr)
return T, nArr, kArr, ans
}
核心方案:
使用map存放已有的數據值,如果從arr[0]累加,遇到map中有值,進行跳過處理
func solve1(n, k int,ans []int)int{
ansMap := make(map[int]bool, n)
for i:=0;i<n;i++{
ansMap[ans[i]] = true
}
val := ans[0]
for k > 0 {
if _, ok := ansMap[val];!ok{
k--
}
val++
}
return val-1
}
題目二:
有m個任務,至多有n個工人,工人之間無差別,每個任務需要的工人數量為a[i],收益為b[i],要求每種方案總收益不少於p,
求有多少種可行的方案,其中:
每個文件輸入第一行輸入一個整數T(《=100》),代表有T組測試數據,接下來T組,每組第一行輸入三個整數m,n,p代表任務的數量,
需要的最多工人數以及需要獲得的最少利潤,接下來輸入m個整數,a[i]代表每一個任務所需的工人數量,輸入m個整數,
b[i]代表每一個任務能獲得的收益
case:
1
2 5 3
2 2
2 3
輸出
2 //一二都做或者僅做第二個
輸入輸出:
type Case struct {
M,N,P int
Nums, Profile []int
}
func ReadData2()([]Case){
var (
T int
m, n, p int
tmp int
)
fmt.Scanln(&T)
cases := make([]Case, 0)
for i:=0;i<T;i++{
fmt.Scanln(&m, &n, &p)
caseTmp := Case{M:m,N:n,P:p,Nums: make([]int, m),Profile: make([]int, m)}
res1 := make([]int,2)
for k:=0;k<m;k++{
for j :=0;j<2;j++{
fmt.Scan(&tmp)
res1[j] = tmp
}
caseTmp.Nums[k] = res1[0]
caseTmp.Profile[k] = res1[1]
}
cases = append(cases, caseTmp)
}
//fmt.Println(cases)
return cases
}
方案:
暴力破解,求出所有可能的組合,進行判斷
func backpack(val Case) int {
cnt := 0
arr := make([]int, val.M, val.M)
res := make([][]int,0)
var sub func(n int)
sub = func(n int) {
if n >= val.M{
tmp := make([]int, len(arr))
copy(tmp, arr)
res = append(res, tmp)
return
}
arr[n] = 0
sub(n+1)
arr[n] = 1
sub(n+1)
return
}
sub(0)
for i:=0;i<len(res);i++{
pro := 0
num := 0
for j := 0;j<len(res[i]);j++{
if res[i][j] == 1{
pro += val.Profile[j]
num += val.Nums[j]
}
}
if pro>=val.P && num < val.N{
cnt++
}
}
return cnt
}
總結:第一題難度不高,但是自己寫輸入輸出的確費點時間,一個小時根本不夠用啊
