復(fù)盤|第106場雙周賽
判斷一個數(shù)是否迷人
【模擬】按題意模擬,計算拼接后的數(shù)字中1-9的數(shù)量是否為1。
【打表】觀察數(shù)字規(guī)律,合法n范圍是[123, 329],進一步可以枚舉所有三位數(shù)n,發(fā)現(xiàn)只有4個數(shù)滿足條件。
找到最長的半重復(fù)子字符串
【滑動窗口】向右移動右指針統(tǒng)計相鄰相同的情況的出現(xiàn)次數(shù),如果次數(shù)大于1,需要不斷向右移動左指針直到s[left] == s[left - 1]說明有一對相鄰相同的字符的左邊移到窗口之外了,此時次數(shù)變回1了,然后統(tǒng)計窗口大小。
移動機器人
【數(shù)學(xué) + 排序 + 前綴和】由于最后是求距離之和,可以把所有機器人看成一樣的,碰撞看作互相穿過對方。設(shè)d秒后機器人的位置數(shù)組為nums,將nums從小到大排序再計算所有機器人之間的兩兩距離之和。從小到大枚舉nums[i],此時左邊有i個數(shù)都不超過nums[i],那么nums[i]與左側(cè)機器人的距離之和為(nums[i] - nums[0]) + (nums[i] - nums[1]) + .... + (nums[i] - nums[i - 1]) = i * nums[i] - (nums[0] + nums[1] + .. nums[i -1]),其中nums[0] + ...nums[i-1]是前綴和,可以一邊遍歷一邊算。python之外的語言為了防止溢出需要在計算中取模。
找到矩陣中的好子集
【貪心 + 哈希表 + 位運算】如果是1行,全為0;如果是2行,不能有同一列都是1,與的結(jié)果是0;3/5行,不可能,因為?k/2?=?(k?1)/2?;4行,必須任意兩行都至少都一列都是1,且不能是同一列,所有至少需要六列,而n至多是5,所有只可能是1或2行。將每一行轉(zhuǎn)換成一個二進制數(shù),用一個字典將二進制數(shù)映射到行號,然后嘗試找到兩個不相交的子集,這兩個子集得到列和均不超過他們各自大小的一半。