【发布时间】:2021-10-17 03:33:32
【问题描述】:
在做https://leetcode.com/problems/search-insert-position时。我发现索引变量的组合很难确定。
例如,我们在代码的每一层都有以下组合。
(1)
l = 0 (stable)
r = len; r = len-1; (outbound / inbound)
(2)
loop(l < r); loop(l <= r) (outbound / inbound)
(3)
l = ind+1 (stable)
r = ind; r = ind-1 (include / exclude)
所以现在你有不同的索引变量组合,其中一些正在工作,但如果你改变其中一个,它不会通过所有测试用例
combo 1:
l=0, r=len (outbound); loop(l < r); l=ind+1, r=ind (include); work
combo 2:
l=0, r=len-1 (inbound); loop(l < r); l=ind+1, r=ind (include); !work
combo 3:
l=0, r=len (inbound); loop(l < r); l=ind+1, r=ind-1 (exclude); !work
combo 4:
l=0, r=len (outbound); loop(l < r); l=ind+1, r=ind (include); work
combo 5:
l=0, r=len-1 (inbound); loop(l<=r); l=ind+1, r=ind (include); work
comb 6:
l=0, r=len (outbound); recursive(l<=r); l=ind+1, r=ind (include); work
下面是我玩的代码。其中一些正在工作,而另一些则不工作
// sm: l=0, r=len (outbound); loop(l < r); l=ind+1, r=ind (include); work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length; // outbound
let ind;
while (l < r) {
ind = Math.floor((l + r) / 2);
if (ns[ind] < tar) {
l = ind + 1;
} else if (ns[ind] > tar) {
r = ind;
} else {
return ind; // existed
}
}
return l; // insert
};
// sm: l=0, r=len-1 (inbound); loop(l < r); l=ind+1, r=ind (include); !work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length - 1; // inbound, cannot insert outbound
let ind;
while (l < r) {
ind = Math.floor((l + r) / 2);
if (ns[ind] < tar) {
l = ind + 1;
} else if (ns[ind] > tar) {
r = ind;
} else {
return ind; // existed
}
}
return l; // insert
};
// sm: l=0, r=len (inbound); loop(l < r); l=ind+1, r=ind-1 (exclude); !work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length;
let ind;
while (l < r) {
ind = Math.floor((l + r) / 2);
if (ns[ind] < tar) {
l = ind + 1;
} else if (ns[ind] > tar) {
r = ind - 1;
} else {
return ind; // existed
}
}
return l; // insert
};
// sm: l=0, r=len (outbound); loop(l < r); l=ind+1, r=ind (include); work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length;
let ind;
while (l < r) {
ind = Math.floor((l + r) / 2);
if (ns[ind] < tar) {
l = ind + 1;
} else if (ns[ind] > tar) {
r = ind;
} else {
return ind; // existed
}
}
return l; // insert
};
// sm: l=0, r=len-1 (inbound); loop(l<=r); l=ind+1, r=ind (include); work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length - 1;
let ind;
while (l <= r) {
ind = Math.floor((l + r) / 2);
if (ns[ind] < tar) {
l = ind + 1;
} else if (ns[ind] > tar) {
r = ind - 1;
} else {
return ind; // existed
}
}
return l; // insert
};
// sm: l=0, r=len (outbound); recurive(l<=r); l=ind+1, r=ind (include); work
var searchInsert = function (ns, tar) {
let l = 0;
let r = ns.length;
return recur(ns, l, r, tar);
};
var recur = function (ns, l, r, tar) {
if (l >= r) {
return l;
}
const ind = Math.floor((l + r) / 2);
if (ns[ind] === tar) {
return ind;
} else if (ns[ind] < tar) {
return recur(ns, ind + 1, r, tar);
} else if (ns[ind] > tar) {
return recur(ns, l, ind, tar);
}
};
const ns = [1, 3, 5, 6];
const tar = 5;
const out = searchInsert(ns, tar);
console.log(out);
我的问题是,当您遇到二分搜索问题时?你怎么知道你要使用哪个索引组合?因为它真的取决于问题,线索和错误
【问题讨论】:
-
为什么你认为combo2不起作用?我在 LeetCode 上试了一下,效果很好。
-
combo 3中,是入站还是出站?我在 LeetCode 上都测试过,都通过了。您是否使用其他方法来测试解决方案?
-
@LearningMathematics [1,3,5,6],7 失败。对于组合 2,您是否复制并粘贴了代码?你用过javascript吗
-
这能回答你的问题吗? Binary Search algorithm implementations
标签: javascript node.js algorithm binary-search