zoukankan      html  css  js  c++  java
  • 数组元素几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位

    在写这篇文章之前,xxx已经写过了几篇关于改数组元素主题的文章,想要了解的朋友可以去翻一下之前的文章

        最小K个数:

        法一:

         用改装的快速排序,分割函数不变。

         分割后返回的标号index若等于k-1或k则退出,

                                              大于k,则递归左边

                                              小于k,则递归右侧

      此法复杂度为O(n),但会挪动原始数据

        法二:

          借助具有k个节点的最大堆

          若总元素数小于等于k,则全部返回

          遍历所有元素,依次增加到一个最大堆中,对堆的元素数坚持计数

          若元素数到达n==k,则在处置下一个数据d 时,

                  若d大于等于最大堆堆顶值,则直接抛弃

                 否则,删除堆顶元素,并将d加入到堆中。

          最终,堆中残余的k个元素即为最小的k个

         此法复杂度O(klogk) ,但好处是无需挪动原始数据,适合大数据情况

        参考自:http://blog.csdn.net/furney/article/details/7987950

        连续子数组的最大和

        问题描述:输入一个整数数组,数组中有正数也有负数,一个或连续的多个整数构成一个子数组,求所有子数组的和的最大值。

        解决方案:

           主要思绪:若前面字串的累加和是正的,再加上下一个数可能还会变大。前面再加上一个负数也没事,因为前面可能会有个绝对值更大的正数,导致团体继承增加

                             而若前面的和是已经是负的,就没必要再累加下去了。就算前面是正数,前面的也只会扯后腿。因此抛弃

                         如:3  -2  3  -5  5 ,看了第一个元素后累加和是3,加上第二个后酿成1,但再前面的3让团体酿成了4。再看到-5后团体变-1,就没必要再累加下去了,只会连累   前面的和。须要重新计数,是5。因此最后结果是5

        

    1. int sum = INT_MIN;   // 初始sum为最小32位有符号数  
    2.     int curSum = 0;  //以后最小和
    3.     for(int i = 0; i < length; ++i)  //遍历整个数组
    4.     {  
    5.         if(curSum <= 0)   //若以后和小于0,则说明已经下落,须要重新开始计数
    6.             curSum = data[i];    //重新计数
    7.         else  
    8.             curSum += data[i];  //继承累加,给前面机会!
    9.           
    10.         if(curSum > sum)  //判断是否更大
    11.             sum = curSum;  
    12.     }  
        每日一道理
    因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!

        可参考:http://blog.csdn.net/furney/article/details/7989075

         

        字符串全排列求法

        递归方案:

            按照人手动盘算的思绪,先固定第一个元素,前面的递归盘算全排列。而第一个元素总共有strlen(str)种可能,可以使用循环。

            思绪:

                 假设序列中没有重复元素。如有,则只要让重复元素在循环中只停止一次便可

        

    1. if(begin == end)   // 递归中止条件
    2.        printf("%s\n", str);  
    3. for(char *x = begin; x < end; x++)  //递归
    4.         {  
    5.             // 交换x和begin指向的字符  
    6.             Swap(x, begin);   
    7.             Permutation(str, begin + 1, end);    //递归前面的序列
    8.             // 恢复x和begin指向的字符  
    9.             Swap(x, begin); 
    10.         }  

         数组循环移位k

        循环左移直观方法:建一个k巨细的缓冲区,先把0~k-1元素复制出来,把前面元素挪动到前面,然后把缓冲区中的k个值挪动回数组的最后

        改进版循环左移(原地交换版):

         首先将前k个元素原地求逆,然后前面所有元素原地求逆,然后整个数组原地求逆。

         1234567循环右移3位  1234567-> 3214567-> 3217654-> 4567123

        循环右移,即为求逆变换的是最后k个元素和前面的元素,然后团体求逆。

         

         

         

         

         

         

         

         

    文章结束给大家分享下程序员的一些笑话语录: 爱情观
      爱情就是死循环,一旦执行就陷进去了。
      爱上一个人,就是内存泄露--你永远释放不了。
      真正爱上一个人的时候,那就是常量限定,永远不会改变。
      女朋友就是私有变量,只有我这个类才能调用。
      情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

    --------------------------------- 原创文章 By
    数组和元素
    ---------------------------------

  • 相关阅读:
    常见概念
    网站扒取
    图书管理系统易错点整理
    CSIC_716_2020104【Django入门---静态文件、request对象方法、ORM增删改查】
    CSIC_716_2020103【Django入门---HttpResponse、render、redirect】
    CSIC_716_2020102【前端框架Bootstrap】
    CSIC_716_2020101【???】
    CSIC_716_20191231【jQuery基础入门】
    CSIC_716_20191230【前端的BOM与DOM】
    ss
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3106745.html
Copyright © 2011-2022 走看看