• 未排序数组中累加和为指定值得最长子数组序列问题


    1.题目:

    给定一个无序数组,其中元素 可正可负可0,给定一个k,求arr中所有的子数组累加和为k的最长子数组长度。

     1 // maxLength.cpp : 定义控制台应用程序的入口点。
     2 //未排序数组中累加和为指定值的最长子数组长度
     3 //数组元素可正、可负、可0
     4 
     5 #include "stdafx.h"
     6 #include<iostream>
     7 #include <map>
     8 #include <iterator>
     9 
    10 /*
    11 声明一个map<key,value>,
    12 key为0到每个位置的累加和,
    13 value为某个累加和最早出现的位置
    14 */
    15 using namespace std;
    16 
    17 
    18 void findMaxLength(int arr[],int len, int k)
    19 {
    20     if(len <= 0)
    21         return;
    22 
    23     map<int,int> myMap;
    24 //map 能保证相等的累加和是出现位置最靠前的那个,之后的插不进去
    25     myMap[0] = -1;//当累加和正好为k时,就找到-1位置
    26     
    27     /*pair<int,int> value(0,-1);
    28     myMap.insert(value);*/       //map的第二种插入方式
    29 
    30     int CurSum = 0;
    31     int result = 0;
    32 
    33     for(int i = 0;i < len; i++)
    34     {
    35         CurSum += arr[i];
    36 
    37         map<int,int>::iterator ite;
    38         if((ite = myMap.find(CurSum - k))!= myMap.end())
    39         {//在map中存在cursum-i,进行一次结算
    40             result = max(result,i - myMap[CurSum - k]);
    41         }
    42         else
    43             myMap[CurSum] = i;
    44          //插入map中的一定是最早的sum值,重复了插入不了
    45     }
    46     if(result == 0) 
    47         cout<<"不存在这样的数组"<<endl;
    48     else
    49         cout<<result<<endl;
    50 }
    51 int _tmain(int argc, _TCHAR* argv[])
    52 {
    53     int arr[] = {1,2,3,4,5,6,7,8,9,10};
    54     int givenValue = 29;
    55     //int givenValue = 29;
    56     int len = 10;
    57     findMaxLength(arr,len,givenValue);
    58     system("pause");
    59     return 0;
    60 }
    View Code

    map作为哈希表来使用,O(logn)时间内插入,查找到元素。

    2.题目:

    给定一个无序数组,其中元素 可正可负可0,求数组中正负数个数相等的最长子数组

     1 // maxLength2.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 #include <map>
     7 #include <iterator>
     8 
     9 using namespace std;
    10 
    11 void maxLength2(int arr[],int len)
    12 {
    13     if(len <= 0)
    14         return;
    15 
    16     /*将整数变为1,负数变为-1,求给定值为0的最长子数组
    17     */
    18     for(int i = 0;i < len ;i++)
    19     {
    20         if(arr[i] < 0)
    21             arr[i] = -1;
    22         else if(arr[i] > 0)
    23             arr[i] = 1;
    24     }
    25 
    26 
    27     int curSum = 0;
    28     int result = 0;
    29 
    30     map<int,int> myMap;
    31     myMap[0] = -1;
    32 
    33     map<int,int>::iterator ite;
    34 
    35     for(int j = 0; j < len; j++)
    36     {
    37         curSum += arr[j];
    38         if((ite = myMap.find(curSum))!=myMap.end())
    39             result = max(result,j - myMap[curSum]);
    40         else
    41             myMap[curSum] = j;
    42     }
    43 
    44     if(result != 0)
    45         cout<<result<<endl;
    46     else
    47         cout<<"不存在"<<endl;
    48 
    49 }
    50 
    51 int _tmain(int argc, _TCHAR* argv[])
    52 {
    53     int arr[] = {1,2,3,4,5,7,-1,-2,-3,-4,-5,0};
    54     int len = 12;
    55     maxLength2(arr,len);
    56     system("pause");
    57     return 0;
    58 }
    View Code

    3.题目:

    给定一个无序数组,其中元素 为0,1,求数组中,0,1个数相等的最长子数组,

    将0变为-1,同问题2

  • 相关阅读:
    (6)Lua 模块与包
    (3)Lua 迭代器与迭代函数
    (二)miller指导查看主控板寄存器操作
    (一)mtg3000常见操作
    (三)NAND flash和NOR flash的区别详解
    (八)shell中的循环结构
    (七)shell编程学习
    (六)动手写第一个shell
    (五)uboot移植补基础之shell
    (四)ubuntu学习前传—uboot中对Flash和DDR的管理
  • 原文地址:https://www.cnblogs.com/lp3318/p/5785542.html
Copyright © 2020-2023  润新知