数组元素几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
2013-05-29 19:46
393 查看
在写这篇文章之前,xxx已经写过了几篇关于改数组元素主题的文章,想要了解的朋友可以去翻一下之前的文章
最小K个数:
法一:
用改装的快速排序,分割函数不变。
分割后返回的标号index若等于k-1或k则退出,
大于k,则递归左边
小于k,则递归右侧
此法复杂度为O(n),但会挪动原始数据
法二:
借助具有k个节点的最大堆
若总元素数小于等于k,则全部返回
遍历所有元素,依次增加到一个最大堆中,对堆的元素数坚持计数
若元素数到达n==k,则在处置下一个数据d 时,
若d大于等于最大堆堆顶值,则直接抛弃
否则,删除堆顶元素,并将d加入到堆中。
最终,堆中残余的k个元素即为最小的k个
此法复杂度O(klogk) ,但好处是无需挪动原始数据,适合大数据情况
参考自:/article/1416279.html
连续子数组的最大和
问题描述:输入一个整数数组,数组中有正数也有负数,一个或连续的多个整数构成一个子数组,求所有子数组的和的最大值。
解决方案:
主要思绪:若前面字串的累加和是正的,再加上下一个数可能还会变大。前面再加上一个负数也没事,因为前面可能会有个绝对值更大的正数,导致团体继承增加
而若前面的和是已经是负的,就没必要再累加下去了。就算前面是正数,前面的也只会扯后腿。因此抛弃
如:3 -2 3 -5 5 ,看了第一个元素后累加和是3,加上第二个后酿成1,但再前面的3让团体酿成了4。再看到-5后团体变-1,就没必要再累加下去了,只会连累 前面的和。须要重新计数,是5。因此最后结果是5
int sum = INT_MIN; // 初始sum为最小32位有符号数
int curSum = 0; //以后最小和
for(int i = 0; i < length; ++i) //遍历整个数组
{
if(curSum <= 0) //若以后和小于0,则说明已经下落,须要重新开始计数
curSum = data[i]; //重新计数
else
curSum += data[i]; //继承累加,给前面机会!
if(curSum > sum) //判断是否更大
sum = curSum;
}
每日一道理
因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!
可参考:/article/1416278.html
字符串全排列求法
递归方案:
按照人手动盘算的思绪,先固定第一个元素,前面的递归盘算全排列。而第一个元素总共有strlen(str)种可能,可以使用循环。
思绪:
假设序列中没有重复元素。如有,则只要让重复元素在循环中只停止一次便可
if(begin == end) // 递归中止条件
printf("%s\n", str);
for(char *x = begin; x < end; x++) //递归
{
// 交换x和begin指向的字符
Swap(x, begin);
Permutation(str, begin + 1, end); //递归前面的序列
// 恢复x和begin指向的字符
Swap(x, begin);
}
数组循环移位k
循环左移直观方法:建一个k巨细的缓冲区,先把0~k-1元素复制出来,把前面元素挪动到前面,然后把缓冲区中的k个值挪动回数组的最后
改进版循环左移(原地交换版):
首先将前k个元素原地求逆,然后前面所有元素原地求逆,然后整个数组原地求逆。
1234567循环右移3位 1234567-> 3214567-> 3217654-> 4567123
循环右移,即为求逆变换的是最后k个元素和前面的元素,然后团体求逆。
文章结束给大家分享下程序员的一些笑话语录:
爱情观
爱情就是死循环,一旦执行就陷进去了。
爱上一个人,就是内存泄露--你永远释放不了。
真正爱上一个人的时候,那就是常量限定,永远不会改变。
女朋友就是私有变量,只有我这个类才能调用。
情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。
---------------------------------
原创文章 By
数组和元素
---------------------------------
最小K个数:
法一:
用改装的快速排序,分割函数不变。
分割后返回的标号index若等于k-1或k则退出,
大于k,则递归左边
小于k,则递归右侧
此法复杂度为O(n),但会挪动原始数据
法二:
借助具有k个节点的最大堆
若总元素数小于等于k,则全部返回
遍历所有元素,依次增加到一个最大堆中,对堆的元素数坚持计数
若元素数到达n==k,则在处置下一个数据d 时,
若d大于等于最大堆堆顶值,则直接抛弃
否则,删除堆顶元素,并将d加入到堆中。
最终,堆中残余的k个元素即为最小的k个
此法复杂度O(klogk) ,但好处是无需挪动原始数据,适合大数据情况
参考自:/article/1416279.html
连续子数组的最大和
问题描述:输入一个整数数组,数组中有正数也有负数,一个或连续的多个整数构成一个子数组,求所有子数组的和的最大值。
解决方案:
主要思绪:若前面字串的累加和是正的,再加上下一个数可能还会变大。前面再加上一个负数也没事,因为前面可能会有个绝对值更大的正数,导致团体继承增加
而若前面的和是已经是负的,就没必要再累加下去了。就算前面是正数,前面的也只会扯后腿。因此抛弃
如:3 -2 3 -5 5 ,看了第一个元素后累加和是3,加上第二个后酿成1,但再前面的3让团体酿成了4。再看到-5后团体变-1,就没必要再累加下去了,只会连累 前面的和。须要重新计数,是5。因此最后结果是5
int sum = INT_MIN; // 初始sum为最小32位有符号数
int curSum = 0; //以后最小和
for(int i = 0; i < length; ++i) //遍历整个数组
{
if(curSum <= 0) //若以后和小于0,则说明已经下落,须要重新开始计数
curSum = data[i]; //重新计数
else
curSum += data[i]; //继承累加,给前面机会!
if(curSum > sum) //判断是否更大
sum = curSum;
}
每日一道理
因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!
可参考:/article/1416278.html
字符串全排列求法
递归方案:
按照人手动盘算的思绪,先固定第一个元素,前面的递归盘算全排列。而第一个元素总共有strlen(str)种可能,可以使用循环。
思绪:
假设序列中没有重复元素。如有,则只要让重复元素在循环中只停止一次便可
if(begin == end) // 递归中止条件
printf("%s\n", str);
for(char *x = begin; x < end; x++) //递归
{
// 交换x和begin指向的字符
Swap(x, begin);
Permutation(str, begin + 1, end); //递归前面的序列
// 恢复x和begin指向的字符
Swap(x, begin);
}
数组循环移位k
循环左移直观方法:建一个k巨细的缓冲区,先把0~k-1元素复制出来,把前面元素挪动到前面,然后把缓冲区中的k个值挪动回数组的最后
改进版循环左移(原地交换版):
首先将前k个元素原地求逆,然后前面所有元素原地求逆,然后整个数组原地求逆。
1234567循环右移3位 1234567-> 3214567-> 3217654-> 4567123
循环右移,即为求逆变换的是最后k个元素和前面的元素,然后团体求逆。
文章结束给大家分享下程序员的一些笑话语录:
爱情观
爱情就是死循环,一旦执行就陷进去了。
爱上一个人,就是内存泄露--你永远释放不了。
真正爱上一个人的时候,那就是常量限定,永远不会改变。
女朋友就是私有变量,只有我这个类才能调用。
情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。
---------------------------------
原创文章 By
数组和元素
---------------------------------
相关文章推荐
- 几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
- C++11新特性应用--介绍几个新增的便利算法(关于最大值和最小值的算法)
- 数组循环移位(左旋转字符串)
- 从一个数组中找出几个数,使其相加等于某个值的算法(数组元素可以重复)
- 字符串算法——查找有序数组旋转后最小值(有重复元素)(Find Minimum in Rotated Sorted Array II)
- 【算法】实现对中文字符串数组按照音序排列
- 关于输入一个字符串,对其进行全排列的两种算法
- 关于字符串“循环左移”算法的讨论
- 数组循环移位O(n) AND 按单词反转字符串
- 关于数组字符串中重复的值问题类似算法题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 旋转字符串;编程珠玑第二章;rotate a one-dimensional vector;循环移位数组;编程之美
- 每天学习一点编程(14)(数组/字符串循环移位)
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 数组左循环移位算法
- 关于数组,字符串的几道面试题和算法题
- C语言中关于字符串左右循环移位的问题
- 1008. 数组元素循环右移问题 (20)——数组循环移动算法
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树