剑指 Offer II 011. 0 和 1 个数相同的子数组
题目描述:给定一个二进制数组 nums
, 找到含有相同数量的 0
和 1
的最长连续子数组,并返回该子数组的长度。
首先,以后再遇到两个数字有相同数量的时候,可以将一个数字换成1,一个数组换成-1,这样通过相加就可以知道两个数字是否数量一致。这样问题就变成了:求最长的连续子数组,使其元素和为0.
另外本题还涉及到一个数组常用的方法,就是前缀和字典。当有两个的前缀和相同时,说明这两者之间的数构成一个0和1数量相同的子数组。(注意:字典中只存储最早出现某counter值的那个下标。例如:如果前3个数的和是0,前6个数的和也是0,那么字典中只存储前3个数的)
代码如下:
public class Solution {
public int FindMaxLength(int[] nums) {
int maxLength = 0;
Dictionary<int, int> dictionary = new Dictionary<int, int>(); //初始化一个字典
int counter = 0;
dictionary.Add(counter, -1); //先初始化一个键值对,因为一开始的总和就是0
int n = nums.Length;
for (int i = 0; i < n; i++) {
int num = nums[i];
if (num == 1) {
counter++;
} else {
counter--;
}
if (dictionary.ContainsKey(counter)) {
int prevIndex = dictionary[counter];
//如果当前的counter值在字典中已经存在,那么直接算这之间子数组长度
maxLength = Math.Max(maxLength, i - prevIndex);
} else {
dictionary.Add(counter, i); //如果当前counter值字典中没有,那么加入字典
}
}
return maxLength;
}
}
字典的好处是在存储值的同时也可以存储值的下标,以下是字典是一些常见用法
原文:C# 存储相同键多个值的Dictionary - Tulip123 - 博客园
static void Main(string[] args)
{
//创建泛型哈希表,Key类型为int,Value类型为string
Dictionary<int, string> myDictionary = new Dictionary<int, string>();
//1.添加元素
myDictionary.Add(1, "a");
myDictionary.Add(2, "b");
myDictionary.Add(3, "c");
//2.删除元素
myDictionary.Remove(3);
//3.假如不存在元素则添加元素
if (!myDictionary.ContainsKey(4))
{
myDictionary.Add(4, "d");
}
//4.显示容量和元素个数
Console.WriteLine("元素个数:{0}",myDictionary.Count);
//5.通过key查找元素
if (myDictionary.ContainsKey(1))
{
Console.WriteLine("key:{0},value:{1}","1", myDictionary[1]);
Console.WriteLine(myDictionary[1]);
}
//6.通过KeyValuePair遍历元素
foreach (KeyValuePair<int,string>kvp in myDictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);}
//7.得到哈希表键的集合
Dictionary<int, string>.KeyCollection keyCol = myDictionary.Keys;
//遍历键的集合
foreach (int n in keyCol)
{
Console.WriteLine("key={0}", n);
}
//8.得到哈希表值的集合
Dictionary<int, string>.ValueCollection valCol = myDictionary.Values;
//遍历值的集合
foreach( string s in valCol)
{
Console.WriteLine("value:{0}",s);
}
//9.使用TryGetValue方法获取指定键对应的值
string slove = string.Empty;
if (myDictionary.TryGetValue(5, out slove))
{
Console.WriteLine("查找结果:{0}", slove);
}
else
{
Console.WriteLine("查找失败");
}
//10.清空哈希表
//myDictionary.Clear();
Console.ReadKey();
}