funcminOperations(nums []int, k int)int { var temp = make(map[int]struct{}) i := len(nums) - 1 for ; i >= 0; i--{ iflen(temp) == k{ break } if _, ok := temp[nums[i]]; !ok && nums[i] <= k{ // 收集到的 temp[nums[i]] = struct{}{} } } returnlen(nums) - i - 1 }
改进 & 代码实现
看了题解以后,发现可以用位运算解决这个问题。那么定义一个集合 all,每当收集到一个元素,all 对应的位变为 1。当 all 与 k 进行位运算得到本身时,收集到所有元素,返回结果。
1 2 3 4 5 6 7 8 9 10 11 12 13
funcminOperations(nums []int, k int)int { var all = 2 << k - 2// 1~k 位全为 1 var i = len(nums) - 1 var set = 0 for ; i >= 0; i--{ set |= 1 << nums[i] if all & set == all{ break } } returnlen(nums) - i }
funcminOperations(nums []int)int { var m = make(map[int]int) for _, num := range nums { if _, ok := m[num]; ok{ m[num]++ }else{ m[num] = 1 } } var ans int for _, val := range m{ for val > 0{ if (val - 3) % 2 == 0 || (val - 3) % 3 == 0{ ans++ val -= 3 continue } if (val - 2) % 2 == 0 || (val - 2) % 3 == 0{ val -= 2 ans++ continue } return-1 } if val != 0{ return-1 } } return ans }
funcmaxSubarrays(nums []int)int { var ans int var a = -1// 全是 1 for i := range nums{ a &= nums[i] if a == 0{ // 分割 ans++ a = -1 } } return max(ans, 1) }
funcmax(x, y int)int{ if x < y{ return y } return x }