给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。
组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
数据范围
-100<=k<=100
-100<=数组中数值<=100
输入描述
第一行输入数组:1 3 1 4 0
第二行输入K数值: 2
输出描述
第一行输出最少交换次数: 1
备注:
小于2的表达式是1 1 0,共三种可能将所有符合要求数字组合一起,
最少交换1次
示例:
输入
1 3 1 4 0
2
输出
1
此题参考力扣1151,因为题目没有说明是环形数组,所以不考虑这种情况 用滑动窗口思想,窗口大小为所有小于k的整数,然后窗口大小减去窗口中小于k的整数则是需要替换的次数
let str = '0 4 4 1 3 3 1'
let k = '2'
function test(str){
let arr = str.split(' ').map(e=>Number(e))
let num = 0
let min = arr.length
arr.map(e=>{
if(e<k){
num++
}
})
for(let i=0;i<arr.length-num+1;i++){
let copyArr = JSON.parse(JSON.stringify(arr))
let window = copyArr.splice(i,num)
let count = 0
for(let j of window){
if(j<k){
count++
}
}
min = Math.min(min,num-count)
}
console.log(min);
}
test(str)
不小心又做了一次,或者
let str = '1 3 1 4 0'
let k = 2
function test(str) {
let arr = str.split(' ').map(e=>Number(e))
let orr = arr.filter(e=>e<k)
let num = orr.length
let right = 0
let minLen = num
while (right+num<=arr.length){
let count = 0
let zrr = []
for(let i=0;i<num;i++){
zrr.push(arr[right+i])
if(arr[right+i]>=k){
count++
}
}
minLen = Math.min(minLen,count)
right++
}
console.log(minLen);
}
test()