JavaScript 对排序二进制数组中的1进行计数
我们有两种方法来计算排序二进制数组中的1的数量。第一种方法是遍历数组并计算1的数量。第二种方法是使用二分搜索算法在数组中找到1的第一次出现的位置。
值得注意的是,为了使用这些方法,数组必须是排序的。
在本博文中,我们将讨论一个JavaScript程序,用于计算排序二进制数组中1的数量。我们还会讨论一些边界情况和优化技巧,使程序更加高效。
问题陈述
给定一个排序的二进制数组,任务是计算数组中1的数量。数组可以是任意大小,元素只能是0或1。
输入
bin_array[] = {0, 0, 0,1,1,1}
结果
3
方法1
脑海中首先想到的方法是遍历数组并计算1的个数。
- 初始化一个计数变量来存储数组中1的个数。
-
遍历数组并检查每个元素。如果当前元素等于1,则增加计数器。
示例
<html>
<body>
<p id="result1"></p>
<p id="result2"></p>
<script>
function count_num_of_Ones( bin_array,n) {
let num_of_ones=0;
for (let ind = 0; ind < n; ind++) {
if(bin_array[ind]==1){
num_of_ones++;
}
}
return num_of_ones;
}
let bin_array = [0,0,0,1,1,1];
let n = bin_array.length;
document.getElementById("result1").innerHTML = "Original Array: " + JSON.stringify(bin_array);
document.getElementById("result2").innerHTML = "Count of 1's in given array is " + count_num_of_Ones(bin_array,n)
</script>
</body>
</html>
然而,这种方法的时间复杂度为O(n),其中n是数组的大小,因为我们遍历了整个数组一次。
通过利用数组已经排序的这一事实,可以进行优化。
方法2
为了找到数组中首个1的实例,可以使用二分搜索的方法。只需将首个1的索引从数组中的总项目数中减去即可得到1的数量。
- 在此实现中,我们使用“第一次出现”的二分搜索技术来找到数组中首个0的实例。
-
初始时,low和high变量分别设置为数组的第一个和最后一个索引。
-
数组中的项目数也被指定为名为firstOne的变量的值,该变量将用于记录数字1的首个实例的索引。
-
在low索引大于high值或等于high值之前,while循环将继续运行。每次迭代后,我们确定当前范围的中间点。
-
如果中间点上的元素为1,则更新firstOne变量,并将high索引移动到前一个元素。如果中间点上的元素为0,则将low索引移动到后续元素。
-
一旦while循环完成,我们检查firstOne变量是否与数组的-1值相对应。如果是,则表示数组中没有1,返回1。如果不是,则返回firstOne减去arr.length。
示例
<html>
<body>
<p id="result1"></p>
<p id="result2"></p>
<script>
function count_num_of_Ones(bin_arr,low,high) {
var low = 0;
var high = bin_arr.length - 1;
var firstOne = -1;
while (low <= high) {
var mid = Math.floor((low + high) / 2);
if (bin_arr[mid] == 1) {
firstOne = mid;
high = mid -1;
} else {
low = mid + 1;
}
}
return firstOne == -1 ? 0 : bin_arr.length - firstOne;
}
let bin_array = [0,0,0,1,1,1,1];
let n = bin_array.length;
document.getElementById("result1").innerHTML = "Original Array: " + JSON.stringify(bin_array);
document.getElementById("result2").innerHTML = "Count of 1's in given array is " + count_num_of_Ones(bin_array,n)
</script>
</body>
</html>
这种方法的时间复杂度为O(log n),比之前的方法效率更高。
在本教程中,我们讨论了一个JavaScript程序,用于计算已排序二进制数组中1的个数。