1.找出数组的最大公约数(模拟+GCD)
func findGCD(nums []int) int {
mx := math.MinInt32
mi := math.MaxInt32
for i := 0 ; i < len(nums) ; i++ {
if nums[i] > mx {
mx = nums[i]
}
if nums[i] < mi {
mi = nums[i]
}
}
return GCD(mx, mi)
}
func GCD(a, b int) int {
for b > 0 {
t := a % b
a = b
b = t
}
return a
}
2.找出不同的二进制字符串 (模拟)
func findDifferentBinaryString(nums []string) string {
m := make(map[int]bool)
for i := 0 ; i < len(nums) ; i++ {
m[getNum(nums[i])] = true
}
max := 65538
for i := 0 ; i < max ; i++ {
if !m[i] {
t := numToBin(i)
for len(t) < len(nums[0]) {
t = "0" + t
}
return t
}
}
return ""
}
func numToBin(n int) string {
result := ""
if n == 0 {
return "0"
}
for ;n > 0;n /= 2 {
lsb := n % 2
result = strconv.Itoa(lsb) + result
}
return result
}
3.最小化目标值与所选元素的差 (dp)
数值大小很小,最后和最多就是4900,所以可以枚举这些和dp[i][j]表示用前i个数能否组成和为j的数,最后枚举最后一行求答案
func minimizeTheDifference(mat [][]int, target int) int {
dp := make([][]bool, len(mat) + 1)
for i := 0 ; i < len(dp) ; i++ {
dp[i] = make([]bool, 4901)
}
dp[0][0] = true
for i := 1 ; i < len(dp) ; i++ {
for j := 0 ; j < 4901 ; j++ {
for k := 0 ; k < len(mat[0]) ; k++ {
if j - mat[i - 1][k] >= 0 && dp[i - 1][j - mat[i - 1][k]] == true {
dp[i][j] = true
break
}
}
}
}
res := math.MaxInt32
for i := 0 ; i < len(dp[0]) ; i++ {
if dp[len(dp) - 1][i] && int(math.Abs(float64(target) - float64(i))) < res {
res = int(math.Abs(float64(target) - float64(i)))
}
}
return res
}