
2026-03-11:最长平衡子数组Ⅰ。用go语言,给定一个整数数组 nums。把数组中任意一段连续且非空的元素称为子数组;如果把子数组里的元素去重后,偶数的个数与奇数的个数相等,就把该子数组称为“平衡子数组”。请找出数组中最长的平衡子数组,并返回它的长度。
1 <= nums.length <= 1500。
1 <= nums[i] <= 100000。
输入: nums = [2,5,4,3]。
输出: 4。
解释:
最长平衡子数组是 [2, 5, 4, 3]。
它有 2 个不同的偶数 [2, 4] 和 2 个不同的奇数 [5, 3]。因此,答案是 4 。
题目来自力扣3719。
我们以输入 nums = [2, 5, 4, 3] 为例,分步拆解 longestBalanced 函数的执行逻辑:
函数首先定义 maxLen = 0,用于记录找到的最长平衡子数组长度,初始值为0。
外层 for 循环(i 从0到len(nums)-1)遍历数组的每一个位置,作为子数组的起始下标:
i=0 时,子数组起始于第0个元素(值为2);i=1 时,子数组起始于第1个元素(值为5);i=2 时,子数组起始于第2个元素(值为4);i=3 时,子数组起始于第3个元素(值为3)。对于每一个起始下标 i,内层 for 循环(j 从i到len(nums)-1)遍历数组,作为子数组的结束下标,并实时统计子数组的奇偶特征:
odd:键为子数组中的奇数,值为该奇数出现的次数(仅记录“存在性”,次数无实际意义);even:键为子数组中的偶数,值为该偶数出现的次数(同理,次数无实际意义)。nums[j]:nums[j]&1 == 1 判断(按位与1,结果为1则是奇数,0则是偶数);odd 中记录该数(次数+1),偶数则在 even 中记录该数(次数+1)。odd 和 even 的键的数量(即去重后的奇偶数量)是否相等:j-i+1,如果比 maxLen 大,则更新 maxLen;输入 nums = [2,5,4,3]:
最终 maxLen=4,函数返回4,与示例输出一致。
n 次(n 为数组长度);i,内层循环最多遍历 n-i 次,总次数为 n + (n-1) + (n-2) + ... + 1 = n*(n+1)/2,即 O(n²);O(1) 时间(字典的增/查操作平均时间复杂度为 O(1));odd 和 even,字典的最大大小取决于子数组中去重后的奇偶数量:n(如数组全为不同奇数/偶数);O(n²)(n为数组长度),双层循环是主要时间开销;O(n),额外空间主要用于存储当前子数组的奇偶统计字典。.
package main
import (
"fmt"
)
func longestBalanced(nums []int)int {
maxLen := 0
for i := 0; i < len(nums); i++ {
odd := make(map[int]int)
even := make(map[int]int)
for j := i; j < len(nums); j++ {
if nums[j]&1 == 1 {
odd[nums[j]]++
} else {
even[nums[j]]++
}
iflen(odd) == len(even) {
if j-i+1 > maxLen {
maxLen = j - i + 1
}
}
}
}
return maxLen
}
func main() {
nums := []int{2, 5, 4, 3}
result := longestBalanced(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def longest_balanced(nums):
max_len = 0
for i in range(len(nums)):
odd = {}
even = {}
for j in range(i, len(nums)):
if nums[j] & 1: # 判断是否为奇数
odd[nums[j]] = odd.get(nums[j], 0) + 1
else:
even[nums[j]] = even.get(nums[j], 0) + 1
iflen(odd) == len(even):
if j - i + 1 > max_len:
max_len = j - i + 1
return max_len
def main():
nums = [2, 5, 4, 3]
result = longest_balanced(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int longestBalanced(vector<int>& nums) {
int maxLen = 0;
for (int i = 0; i < nums.size(); i++) {
unordered_map<int, int> odd;
unordered_map<int, int> even;
for (int j = i; j < nums.size(); j++) {
if (nums[j] & 1) { // 判断是否为奇数
odd[nums[j]]++;
} else {
even[nums[j]]++;
}
if (odd.size() == even.size()) {
if (j - i + 1 > maxLen) {
maxLen = j - i + 1;
}
}
}
}
return maxLen;
}
int main() {
vector<int> nums = {2, 5, 4, 3};
int result = longestBalanced(nums);
cout << result << endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·