2134. 最少交换次数来组合所有的 1 II(2022-3-7)
交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 nums
,返回在 任意位置 将数组中的所有 1
聚集在一起需要的最少交换次数。
示例 1:
输入:nums = [0,1,0,1,1,0,0]
输出:1
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[0,0,1,1,1,0,0] 交换 1 次。
[0,1,1,1,0,0,0] 交换 1 次。
[1,1,0,0,0,0,1] 交换 2 次(利用数组的环形特性)。
无法在交换 0 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 1 。
示例 2:
输入:nums = [0,1,1,1,0,0,1,1,0]
输出:2
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[1,1,1,0,0,0,0,1,1] 交换 2 次(利用数组的环形特性)。
[1,1,1,1,1,0,0,0,0] 交换 2 次。
无法在交换 0 次或 1 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 2 。
示例 3:
输入:nums = [1,1,0,0,1]
输出:0
解释:得益于数组的环形特性,所有的 1 已经聚集在一起。
因此,需要的最少交换次数为 0 。
提示:
1 <= nums.length <= 10^5
nums[i]
为0
或者1
解题思路
滑动窗口+前缀和,不能嵌套遍历,容易超时。
思路其实很简单:如果1
都连起来,那么长度len
是固定的,就是1
的个数;
随便截取长度len
的子数组,查清楚其中0
的个数也就是当前的交换次数;
我们遍历数组中的每一个长度为len
的子数组,维护最少的0
个数,即为正确答案。
tips:
- 关于环状数组,当右指针指向末尾时,重指向0即可;或者把
nums
后边再拼接一个nums
- 关于查找0的个数,如果我们直接在子数组中遍历,是万万不行的,嵌套的循环一定会导致超时。数据长度已经达到了
10^5
。 - 要用「滑动窗口」的方式查找
0
的个数,先创建一个窗口,并查找其中0
的个数计为zeros
,然后开始挪动指针;每次移动去检查左端被抛弃的那个元素,和右端新加入的那个元素;检查他们是否为0
,yes => 左端 =>zeros
减去1;yes => 右端 =>zeros
加上1。 - 每次移动中,
zeros
的最小值即为答案
var minSwaps = function(nums) {
let oneCount = nums.reduce((sum,v)=> sum +=v)
let zero = 0 , left = 0, right = oneCount
for(let i = 0; i < right; i++){
zero += (nums[i]+1) & 1
}
let ret = zero
while(left < nums.length){
if(right == nums.length) right =0
zero += ((nums[right++] ^ 1) - (nums[left++] ^ 1))
ret = Math.min(ret,zero)
}
return ret
};
504. 七进制数(2022-3-7)
给定一个整数 num
,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100
输出: “202”
示例 2:
输入: num = -7
输出: “-10”
提示:
-107 <= num <= 107
解题思路
直接API大法!toString(7)
!开个小玩笑哈哈哈哈
万能模板一定要背会!
- 先记录负号(如果有的话)
num%7
就可以取得每一位上的数。比如13%7=6,(13/2)%7=1,结果就是16num / 7 | 0
除7取整,相当于换下一位。
方便理解的公式:设十进制数n
的七进制数为abcd
d
=
n
m
o
d
7
,
c
=
(
n
/
7
)
m
o
d
7
,
b
=
(
n
/
7
/
7
)
m
o
d
7
,
a
=
(
n
/
7
/
7
/
7
)
m
o
d
7
d= n mod 7, c=(n/7)mod7, b=(n/7/7)mod7, a=(n/7/7/7)mod7
d=nmod7,c=(n/7)mod7,b=(n/7/7)mod7,a=(n/7/7/7)mod7
= > n = d ∗ 7 0 + c ∗ 7 1 + b ∗ 7 2 + a ∗ 7 3 => n = d * 7^0 + c * 7^1 + b * 7^2 + a * 7^3 =>n=d∗70+c∗71+b∗72+a∗73
var convertToBase7 = function(num) {
let is = num < 0
if(is) num = -num
let ret = ''
do{
ret = num % 7 + ret
num = num / 7 | 0
}while(num)
return is ? '-' + ret : ret
// return num.toString(7)
};