刷题日记(6)

3001. 捕获黑皇后需要的最少移动次数

解题思路

从题中简要分析可以知道最多就是两次,最少就是一次,其他情况就是两次。两次的情况最复杂,于是想办法找出一次,剩下就是两次。

  • 如果在车同行或同列,在象的对角线上那么答案为1,其他情况都为2


    对角线原则
func minMovesToCaptureTheQueen(a int, b int, c int, d int, e int, f int) int {
    if a == e && (c != e || ok(b,d,f)) ||  //如果车跟皇后在同行且象没有阻拦,或象并没有在车皇后之间
       b == f && (d != f || ok(a,c,e)) || // //如果车跟皇后在同列且象没有阻拦,或象并没有在车皇后之间
        c+d == e+f && (a+b != e+f || ok(c,a,e)) ||  //从图中可以看到同对角线的值都相等
        c-d == e-f && (a-b != e-f || ok(c,a,e)){
            return 1
        }
        return 2
}

func ok(l,m,r int)bool{
    return m < min(l,r) || m > max(l,r)
}

3002. 移除后集合的最多元素数

解题思路

因为要保留最多的元素,所以尽量要去除相同的元素。

  • 设nums1有n个不同元素,nums2有m个不同元素,它们的交集有common个元素。

  • 由于每个数组只能选择n/2个元素,且最好选不在交集中的数,于是c1 = min(n-common,n/2),同理c2 = min(m-common,n/2)。

  • 若c1+c2 < n,那么还可以从common中选,于是答案变成c1+c2+min(n-c1-c2,common) = min(n,c1+c2+common)

func maximumSetSize(nums1, nums2 []int) int {
    set1 := map[int]bool{}
    for _, x := range nums1 {
        set1[x] = true
    }
    set2 := map[int]bool{}
    for _, x := range nums2 {
        set2[x] = true
    }
    m := len(nums1)/2
    common := 0
    for x := range set1 {
        if set2[x] {
            common++
        }
    }
    c1 := min(m,len(set1)-common)
    c2 := min(m,len(set2)-common)

    return min(len(nums1),c1+c2+common)
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 思路总结 数组: 数组内顺序: 是否有序? 如果排序,是否会有额外的性质? 递增、递减在该题内的含义? prefi...
    童言铜盐阅读 4,982评论 0 0
  • week1 2020.3.8 - 2020.3.15 26 27 41 55 dp, dp[i] = max(dp...
    log1302阅读 3,738评论 0 0
  • 最近正在找实习,发现自己的算法实在是不能再渣渣,在网上查了一下,发现大家都在刷leetcode的题,于是乎本渣渣也...
    caoxian阅读 4,494评论 0 2
  • 51. 加法 不使用+、-,计算两数字之和 52. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)...
    毒死预言家的女巫阅读 3,959评论 0 0
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,229评论 0 0

友情链接更多精彩内容