当前位置:   article > 正文

牛客NC125 和为K的连续子数组【中等 哈希+前缀和 Java,Go,PHP】

牛客NC125 和为K的连续子数组【中等 哈希+前缀和 Java,Go,PHP】

题目

在这里插入图片描述
题目链接
https://www.nowcoder.com/practice/704c8388a82e42e58b7f5751ec943a11

思考

滑动窗口,map,前缀和
  • 1

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * max length of the subarray sum = k
     * @param arr int整型一维数组 the array
     * @param k int整型 target
     * @return int整型
     */
    public int maxlenEqualK (int[] arr, int k) {
        //滑动窗口
        int n = arr.length;
        Map<Integer, Integer> map = new HashMap<>();
        int sum = 0, ans = 0;
        map.put(0, -1);
        for (int i = 0; i < n ; i++) {
            sum += arr[i];

            if (!map.containsKey(sum)) //第一次的时候存入map
                map.put(sum, i);

            if (map.containsKey(sum - k)) { //更新答案
                ans = Math.max(ans, i - map.get(sum - k));
            }
        }
        return ans;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

参考答案Go

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * max length of the subarray sum = k
 * @param arr int整型一维数组 the array
 * @param k int整型 target
 * @return int整型
 */
func maxlenEqualK(arr []int, k int) int {
	// 滑动窗口

	cache := map[int]int{}
	cache[0] = -1

	ans := 0
	sum := 0 //前缀和
	for i, v := range arr {
		sum = sum + v

		_, ok := cache[sum]
		if !ok { //第一次的时候才放入map
			cache[sum] = i
		}

		_, ok1 := cache[sum-k]
		if ok1 { //更新答案
			tmp := i - cache[sum-k]
			if ans < tmp {
				ans = tmp
			}
		}
	}
	return ans
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * max length of the subarray sum = k
 * @param arr int整型一维数组 the array
 * @param k int整型 target
 * @return int整型
 */
function maxlenEqualK( $arr ,  $k )
{
   // 滑动窗口
    $map = [0 => -1];
    $ans = 0;
    $sum = 0; //前缀和

    foreach ($arr as $i => $v) {
        $sum += $v;

        if (!isset($map[$sum])) { //第一次的时候才存入map
            $map[$sum] = $i;
        }

        if (isset($map[$sum - $k])) {//更新答案
            $t = $i - $map[$sum - $k];
            if ($t > $ans) {
                $ans = $t;
            }
        }
    }

    return $ans;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/291252
推荐阅读
相关标签
  

闽ICP备14008679号