随机获取Leetcode解题
.按列翻转得到最大值等行数
给定mxn矩阵matrix。
你可以从中选出任意数量的列并翻转其上的每个单元格。(即翻转后,单元格的值从0变成1,或者从1变为0。)
返回经过一些翻转后,行与行之间所有值都相等的最大行数。
思路:
行与行之间所有值都相等,换个思路就是,就是说这两行所有相同位置的值要么都是相同的,要么都是相反的。把每行看出一个二进制,则要么数值相同,要么按位异或后数值相同。
同一异或对比的初始数字为0。首数字为1的行整行异或。最后map每个列值出现的次数。
////leecode.swift//SwiftPritice////CreatedbyHarryon/3/30.//importFoundationclassRowsAfterFlips{functest(){letdate=Date()letmatrixx=[[1,0,0,0,1,1,1,0,1,1,1],[1,0,0,0,1,0,0,0,1,0,0],[1,0,0,0,1,1,1,0,1,1,1],[1,0,0,0,1,0,0,0,1,0,0],[1,1,1,0,1,1,1,0,1,1,1]]print("RowsAfterFlips:",maxEqualRowsAfterFlips(matrixx),"-",Date().timeIntervalSince(date))}fileprivatefuncmaxEqualRowsAfterFlips(_matrix:[[Int]])-Int{varmap=[String:Int]()matrix.forEach{arrinvarkey=""ifarr[0]==0{key=arrToString(arr)}else{varlist=[Int]()forvinarr{list.append(v^1)}key=arrToString(list)}ifmap[key]==nil{map[key]=1}else{map[key]=(map[key]??0)+1}}varm=0for(_,v)inmap{m=max(m,v)}returnm}fileprivatefuncarrToString(_arr:[Int])-String{vars=""forvinarr{//s=String(format:"%s%d",s,v)s=s.appending(String(v))}returns}}
在main.swift里
RowsAfterFlips().test()
下边是提交的结果:
88/88个通过测试用例
状态:通过
执行用时:ms
内存消耗:15MB
欢迎大家指正
PS:
异或是个好东西,不少简单算法都会用到它,比如在数组里找不成对的唯一一个数字
预览时标签不可点收录于合集#个上一篇下一篇