两指针--减少数组循环

题目(lintcode):

1.二数之和

2.三数之和

3.最接近的三数之和

4.四数之和

   取三数之和为例:

(一)

  普通算法,多重遍历数组,需要多重for嵌套,但严重超时。

(二)

  剪枝,在外层循环中考虑有没有“不可能符合要求”的情况。

  例如,在三数之和中,若两个数之和大于0,直接break。但题目没说不会出现负数,所以不对。

(三)

  接(二),判断两个数之和大于0无效,是因为数组无序,所以先进行排序

   sort(nums.begin(),nums.end());

  之后可以在保证大于0时,break掉。像这样:

for (int i = 0; i < nums.size(); i++) {
    if (nums[i] > 0) break;
    for (int j = i;j < nums.size(); j++) {
        if (nums[j] >= 0 && nums[j] +nums[i] > 0) break;
            for (int k = j; k < nums.size(); k++) {

(四)

  设置两个指针,分别指向“数组首”(front)和“数组尾”(rear),计算两指针处的和,再加上for循环的一个数,得到三数和sum:

  若sum大于零,使和变小,rear-- 即可;若sum小于零,使和变大,front++ 即可。

vector<vector<int> > threeSum(vector<int> &nums) {
        set<vector<int> > re;
        vector<int> in;
        sort(nums.begin(), nums.end(), greater<int>());
        int front, rear, sum;
        for (int i = 0; i < nums.size(); i++) {
            front = 0;
            rear = nums.size() -1;
            while (front < rear) {
                if (front == i) front++;
                else if (rear == i) rear--;
                if (front == rear) break;
                sum = nums[front] + nums[rear] + nums[i];
                if (sum == 0) {
                    in.clear();
                    in.push_back(nums[front]);
                    in.push_back(nums[rear]);
                    in.push_back(nums[i]);
                    sort(in.begin(), in.end());
                    re.insert(in);
                    do {front++;}
                    while (front < rear && nums[front] == nums[front - 1]);
                }
                else if (sum > 0) front++;
                else rear--;
            }
        }
        return vector <vector<int>>(re.begin(),re.end());
    }
时间: 2024-08-26 05:59:47

两指针--减少数组循环的相关文章

C++入门经典-例6.14-通过指针连接两个字符数组

1:字符数组是一个一维数组,引用字符数组的指针为字符指针,字符指针就是指向字符型内存空间的指针变量. char *p; char *string="www.mingri.book"; 2:实例,通过指针连接两个字符数组,代码如下: // 6.14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; void main() { char st

JS数组循环的两种方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta h

C语言--&gt;(十一)指针于数组

知识点: • 指针与变量 (指向变量的指针)• 指针与函数 (地址传递) • 指针与数组 (指向数组的指针) • 指针与字符串 =================================数组的指针 1.什么是数组指针 1)数组的指针是指数组在内存的的起始位置 2)数组的第一个元素和数组的起始地址一致 2.数组名的本质 1)数组名本质上是一个地址常量,代表的是数组的首地址也就是第一个元素的地址 数组名表示表示数组的起始地址,不表示整个数组,不能对数组整体赋值. 3.数组名为一个指针常量,可

转: 浅谈C/C++中的指针和数组(二)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址 规则2:下标总是与指针的偏移量

附录一 再论指针和数组

附录一 附录一 再论指针和数组 再论指针和数组 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 链表单元有哪几个部分组成 如何申请链表单元,及释放链表单元 实现单链表插入的基本语法 简述一下快速排序基本理论要点 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Dat

深入理解C指针之四:指针和数组

数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数组和指针的区别之一就是,尽管数组的名字可以返回数组地址,但是名字不能作为赋值操作的目标. 概述 数组是能用索引访问的同质元素连续集合.数组的元素在内存中是相邻的,而且元素都是同一类型的.数组的长度是固定的,realloc函数和变长数组提供了应对长度需要变化的数组的技术. 一维数组是线性结构,用一个索引访问成员.取决于不同的内存模型,数组

指针和数组解析

指针和数组 指针和数组是一样的吗? 经常可以看到“数组就是指针”.“数组名就是常量指针”这些说法,但真的是这样吗?让我们先看一下指针和数组的定义. 1. 指针 根据C99标准,指针的定义如下: A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

【黑客免杀攻防】读书笔记12 - 指针与数组

1.指针与数组 C源码 前两组printf()函数是以指针方式访问数组nArray中的数据的,而后两组printf()函数则是使用数组下标的方式访问数组nArray中的数据的. int _tmain(int argc, _TCHAR* argv[]) { // 数组赋值 int nArray[3] = {0x10,0x20,0x300}; // 数组地址赋值给指针 int *pPtr = nArray; // 输出指针中地址 printf("%x %x %x\r\n", pPtr+0,