
讨论一个问题来回答对给定数组的查询。例如,对于每个查询索引,我们需要查找索引左侧的 1 和 0 的数量。
Input: arr[ ] = { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0}, queries[ ] = { 2, 4, 1, 0, 5 }
Output:
query 1: zeros = 1,ones = 1
query 2: zeros = 1,ones = 3
query 3: zeros = 1,ones = 0
query 4: zeros = 0,ones = 0
query 5: zeros = 2,ones = 3
Input: arr[ ] = { 0, 0, 1, 1, 1, 0, 1, 0, 0, 1 }, queries[ ] = { 3, 2, 6 }
Output:
query 1: zeros = 2,ones = 1
query 2: zeros = 2,ones = 0
query 3: zeros = 3,ones = 3寻找解决方案的方法
天真的方法
解决这个问题的简单方法是遍历数组到查询的索引并检查每个元素;如果为 0,则将零计数器加 1,否则将个计数器加 1。
示例
#includeusing namespace std; int main(){ int nums[] = {1, 0, 0, 1, 1, 0, 0, 1, 0, 0}; int queries[] = { 2, 4, 1, 0, 5 }; int qsize = sizeof(queries) / sizeof(queries[0]); int zeros=0,ones=0; // loop for running each query. for(int i = 0;i 输出
query 1: zeros = 1,ones = 1 query 2: zeros = 2,ones = 2 query 3: zeros = 0,ones = 1 query 4: zeros = 0,ones = 0 query 5: zeros = 2,ones = 3高效方法
在之前的方法中,每次我们都从第 0 个索引开始计算新查询的 1 和 0。
另一种方法是首先计算 0 和 1。出现在每个索引的左侧,将它们存储在数组中,并根据查询中写入的索引返回答案。
立即学习“C++免费学习笔记(深入)”;
示例
#includeusing namespace std; int main(){ int nums[] = {1, 0, 0, 1, 1, 0, 0, 1, 0, 0}; int queries[] = { 2, 4, 1, 0, 5 }; int n = sizeof(nums) / sizeof(nums[0]); int arr[n][2]; int zeros = 0, ones = 0; // traverse through the nums array. for (int i = 0; i < n; i++) { // store the number of zeros and ones in arr. arr[i][0] = zeros; arr[i][1] = ones; // increment variable according to condition if (nums[i]==0) zeros++; else ones++; } int qsize = sizeof(queries) / sizeof(queries[0]); for (int i = 0; i < qsize; i++) cout << "\nquery " << i+1 << ": zeros = " << arr[queries[i]][0] << ",ones =" << arr[queries[i]][1]; return 0; } 输出
query 1: zeros = 1,ones =1 query 2: zeros = 2,ones =2 query 3: zeros = 0,ones =1 query 4: zeros = 0,ones =0 query 5: zeros = 2,ones =3结论
在本教程中,我们讨论了为给定数组中的每个查询返回索引左侧的 1 和 0 的数量。我们讨论了解决这个问题的简单方法和有效方法。我们还讨论了解决此问题的 C++ 程序,我们可以使用 C、Java、Python 等编程语言来实现。我们希望本教程对您有所帮助。











