20220122剑指offer刷题

剑指 Offer II 011. 0 和 1 个数相同的子数组

题目描述:给定一个二进制数组 nums , 找到含有相同数量的 01 的最长连续子数组,并返回该子数组的长度。

首先,以后再遇到两个数字有相同数量的时候,可以将一个数字换成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();
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值