contest-255

110 阅读1分钟

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
}