Contiguous Array

225 篇文章 0 订阅

Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.

Example 1:

Input: [0,1]
Output: 2
Explanation: [0, 1] is the longest contiguous subarray with equal number of 0 and 1.

Example 2:

Input: [0,1,0]
Output: 2
Explanation: [0, 1] (or [1, 0]) is a longest contiguous subarray with equal number of 0 and 1.

Note: The length of the given binary array will not exceed 50,000.

比较巧妙的一道题,正常写的话会TLE,参考答案的思路是,设置一个计数,如果遇到1,则+1, 遇到0, 则-1。这样的话会有这种结论:当出现两个index他们的值相等的时候,说明,他们之间的1的个数刚好等于0的个数。


代码:

    public int findMaxLength2(int[] nums) {
        if(nums == null || nums.length == 0) return 0;

        HashMap<Integer, Integer> map = new HashMap<>();
        int count = 0;
        map.put(0, 0);

        for(int i=0;i<nums.length;i++) {
            if(nums[i] == 1) {
                count++;
            }
            map.put(i+1, count);
        }

        int length = nums.length;
        while(length>0) {
            if(length % 2 != 0) {
                length--;continue;
            }

            for(int i=0;i<=nums.length-length;i++) {
                if((map.get(i+length) - map.get(i)) == (length/2)) { // 这里减法不用+1, 因为就是算的差的部分的长度
                    return length;
                }
            }
            length-=2;
        }
        return 0;
    }


这里的i 理解为: 在i之前的部分的和。

 public int findMaxLength(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        HashMap<Integer, Integer> map = new HashMap<>();

        map.put(0, 0);//index = -1, value = 0
        int count = 0;
        int maxLength = 0;
        for(int i=0;i<nums.length;i++) {
            count += nums[i] == 1 ? 1: -1;
            if(map.containsKey(count)) {
                maxLength = Math.max(maxLength, i+1 - map.get(count));
            } else {
                map.put(count, i+1);
            }
        }
        return maxLength;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误通常是由于您使用的 numpy 数组不是连续存储的内存块引起的。要解决这个问题,您可以尝试使用 `numpy.ascontiguousarray()` 函数来创建一个数据是连续存储的副本。 例如: ``` import numpy as np # 创建一个不连续的数组 a = np.empty((3,3)) a[::2,::2] = 1 # 使用 ascontiguousarray() 创建连续存储的数组 b = np.ascontiguousarray(a) print(b) ``` 输出: ``` array([[1., 0., 1.], [0., 0., 0.], [1., 0., 1.]]) ``` 请注意,使用 `ascontiguousarray()` 函数可能会导致内存复制,因此它可能会影响性能。如果您需要处理大型数据集,可能需要考虑使用其他方法来避免内存复制。 ### 回答2: 当使用numpy时,出现“Return a contiguous array (ndim >= 1) in memory (C order)”的错误通常是由于数组的存储顺序不正确所导致的。为了解决这个问题,可以尝试以下几个方法: 1. 使用numpy数组的`array()`函数创建数组时,通过指定`order='C'`参数来确保数组以C顺序存储。例如: ```python import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]], order='C') ``` 2. 当使用numpy中的函数创建数组时,可以使用`np.ascontiguousarray()`函数来强制数组以C顺序存储。例如: ```python import numpy as np arr = np.ascontiguousarray([[1, 2, 3], [4, 5, 6]]) ``` 3. 如果已经有一个数组,并且希望将其转换为C顺序存储,可以使用`np.ndarray`对象的`copy()`方法来创建一个拷贝,并通过设置`order='C'`参数来确保拷贝的数组以C顺序存储。例如: ```python import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) # 假设现有一个数组 new_arr = arr.copy(order='C') # 创建以C顺序存储的拷贝 ``` 通过以上方法,可以确保numpy数组以C顺序存储,从而解决报错问题。 ### 回答3: 当出现“Return a contiguous array (ndim >= 1) in memory (C order)”错误时,意味着你的代码中的某个数组不是“连续数组”。这个错误通常发生在你尝试使用numpy函数时,函数要求输入一个连续数组(即在内存中以C顺序存储的数组),但你提供的数组不符合要求。 为了解决这个问题,你可以尝试以下方法: 1. 将输入数组转换为连续数组:你可以使用numpy的`ascontiguousarray()`函数将输入数组转换为连续数组。这将确保数据在内存中以C顺序进行存储。 2. 检查数组的内存布局:通过使用数组对象的`flags`属性,你可以检查内存布局是F(Fortran)顺序还是C(C)顺序。确保你的数据以C顺序存储,否则使用`np.ascontiguousarray()`进行布局转换。 3. 检查数据类型:确认你的数组的数据类型是否符合要求。有时数据类型不匹配可能会导致此错误。 以下是一个示例代码,演示了如何解决此错误: ```python import numpy as np # 创建一个非连续数组 arr = np.array([[1, 2, 3], [4, 5, 6]], order='F') # 检查数组的内存布局 print(arr.flags) # 尝试使用非连续数组进行操作,将会报错 # np.sum(arr) # 将数组转换为连续数组 arr_contiguous = np.ascontiguousarray(arr) # 确认转换后的数组是连续数组 print(arr_contiguous.flags) # 现在可以使用连续数组进行操作 print(np.sum(arr_contiguous)) ``` 通过将非连续数组使用`np.ascontiguousarray()`转换为连续数组,你可以解决“Return a contiguous array (ndim >= 1) in memory (C order)”错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值