挑战编程题(二)

昨天的题目:http://www.cnblogs.com/qiange/p/5062213.html

1. 求两个数的和

给定一个整型数组,从中挑选两个数字,使其相加为一个为一个给定的值,返回这两个值所有数组中位置下标,位置下标小的在前面,位置下标从1开始。

 

例如:

输入:nums= {2,7,11,13}  target=24

输出:3,4

//解法1:最简单的方法,用两层循环,算法如下,算法复杂度为O(n*n)
//这个也是最容易想到的。
vector<int> twoSum1(vector< int>& nums, int target) {
                 int i=0;
                 int count = nums.size();
                 while(i<count){
                                 int j=i+1;
                                 while(j<count){
                                                 if(nums[i]+nums[j]==target){
                                                                vector< int> r;
                                                                r.push_back(i+1);   //下标+1 因为下标从1开始的
                                                                r.push_back(j+1);
                                                                 return r;
                                                }
                                                j++;
                                }
                                i++;
                }

}

//解法2:利用hash表,c++中可以使用map。时间复杂度O(n)
vector<int> twoSum2(vector< int>& nums, int target){
                vector< int> result;
                unordered_map< int,int > maping;
                 //1.用数组中nums中的值key,用下标作为value;
                 for (int i=0;i<nums.size();i++){
                                maping[nums[i]]=i;
                }

                 for (int i=0;i<nums.size();i++){
                                 //2.求的另一个加数
                                 int otherNum = target-nums[i];
                                 //3.从maping中寻找key为另一个加数的value
                                 if(maping.find(otherNum)!=maping.end() && maping[otherNum]!=i){
                                                result.push_back(i+1);
                                                result.push_back(maping[otherNum]+1);
                                                 break;
                                }
                }

                 return result;
}

  

两种算法的运行结果如下:

第二种方法是一种很巧妙的利用空间来换取时间,并利用了hash快速定位的特别

今天的题目( Add Two Numbers)

  1. 有两个非负数的链表,每个链表都反序的存储一个多位数字的每一位,(例如:链表2->4->3  数字342),现在求两个链表数字的相加,求和的链表。

例如: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

Output: 7 -> 0 -> 8

/**

* Definition for singly-linked list.

* struct ListNode {

*     int val;

*     ListNode *next;

*     ListNode(int x) : val(x), next(NULL) {}

* };

*/

//函数

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

}

如有问题,欢迎和我联系。 我的邮箱 [email protected] 

时间: 2024-10-09 06:09:52

挑战编程题(二)的相关文章

挑战编程题(三)

接 挑战编程题(二)http://www.cnblogs.com/qiange/p/5090588.html 题目: 有两个非负数的链表,每个链表都反序的存储一个多位数字的每一位,(例如:链表2->4->3  数字342),现在求两个链表数字的相加,求和的链表. 例如: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 /** * Definition for singly-linked lis

挑战编程题(一)

编程最需要的就是理论结合实践,现在我们就来一起从最简单的LeetCode开始,我从今天开始,每天都会解析前一天的题目(今天是第一天),然后发布明天要解析的题目,大家可以和我一起做题目,将你对题目做法(语言不限),发给我也(邮箱[email protected]),也可以直接在下面评论,大家一起研究.在第二天我会发布我写答案和解释,也会挑选我收到的好的解析公布在这里. 1. 求两个数的和 给定一个整型数组,从中挑选两个数字,使其相加为一个为一个给定的值,返回这两个值所有数组中位置下标,位置下标小的

[编程题]二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 备注: 因为之前学的是java,js是刚学不久,所以今天这道题让我重新了认识了数组在js中的存在形式(下面这张图用来自己记忆js中数组的结构): 这道题的思路: 举例: [1,2,3,4] [3,5,7,9] 假设二维数组是arr[x][y],要判断的整数是target=4,从最后一行第一个数开始比较,a

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

POJ C++程序设计 编程题#10:输出指定结果二

编程题#10:输出指定结果二 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024kB 描述 通过填空使得程序输出的结果符合下面的要求. #include <iostream> #include <map> using namespace std; // 在此处补充你的代码 int A::count = 0; void func(B b) { } int mai

编程题:用二维字符串数组实现。从键盘输入三个学生姓名,并输出。

#include<stdio.h> #include<string.h> void main() { char name[3][30]; int i; for(i=0;i<3;i++) gets(name[i]);  /*name[i]是一个一维字符数组*/ for(i=0;i<3;i++) printf("%s\n",name[i]); } 编程题:用二维字符串数组实现.从键盘输入三个学生姓名,并输出.,布布扣,bubuko.com

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

编程题:二维数组的下标意义

#include<stdio.h> void main() { int i,j,a[2][3],b[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i; for(i=0;i<2;i++) for(j=0;j<3;j++) b[i][j]=j; printf("array a:\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%3d

POJ C++程序设计 编程题#2 魔兽世界之二:装备

编程题#2: 魔兽世界之二:装备 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士.武士一共有 dragon .ninja.iceman.lion.wolf 五种.每种武士都有编号.生命值这两