Qihe

Qihe Blog

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

主要知识点:哈希法 数组

哈希表相关操作(JS实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/*初始化哈希表 */
const map = new Map();
/* 添加操作 */
// 在哈希表中添加键值对 (key, value)
map.set(12836, '小哈');
map.set(15937, '小啰');
map.set(16750, '小算');
map.set(13276, '小法');
map.set(10583, '小鸭');
/* 查询操作 */
// 向哈希表中输入键 key ,得到值 value
let name = map.get(15937);
/* 删除操作*/
// 在哈希表中删除键值对 (key, value)
map.delete(10583);


哈希表三种常用遍历方式:遍历键值对、遍历键和遍历值。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/* 遍历哈希表 */
console.info('\n遍历键值对 Key->Value');
for (const [k, v] of map.entries()) {
console.info(k + ' -> ' + v);
}

console.info('\n单独遍历键 Key');
for (const k of map.keys()) {
console.info(k);
}

console.info('\n单独遍历值 Value');
for (const v of map.values()) {
console.info(v);
}


思路:num[i]+num[j]==target
1.暴力解法:双循环
code:

1
2
3
4
5
6
7
8

for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(num[i]+num[j]==target){
return [i,j]}
}
}

复杂度:O(n2)


2.哈希法
code:

1
2
3
4
5
6
7
8
9

let map =new Map() //创建空哈希表
for(let i=0;i<nums.length;i++){
if(map.has(target-nums[i])){
return [i,map.get(target-nums[i])]
}
map.set(nums[i],i) //存储nums[i],i
}

复杂度:O(n)


在此题中使用哈希法是牺牲空间换取时间的做法 降低时间复杂度

排序算法

快速排序

快速排序基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度:平均时间复杂度O(nlogn) 最差情况下会变为O(n2)

基本思路如下:

1.设置分界值,通过该分界值将数组分为两部分。

2.将大于等于分界值数据集中在数组的右边,小于等于分界值数据集中在数组的左边。

3.递归:将左边和右边的数据分别独立排序,对于左侧数组再取一次分界点,又将分为两个部分,右侧数组数据也做一样的处理,通过递归排好左侧 再排右侧。

代码模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include<iostream>
using namespace std;
int q[N];
const int N=1e5+10;
void quicksort(int q[],int l,int r){
//若数组就一个数 直接返回数值
if(l>=r>) return;
//这里写l==r也可以 >=也包含==的情况
//选取分界点
int x=q[l+r>>1];
//l+r>>1是选中间的点
int i=l-1,j=r+1;//防止边界问题
while(i<j>){
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j) swap(q[i],q[j])
quick_sort(q,l,j),quick_sort(q,J+1,r);//递归排序左右
}
}

cout<<”over~”<< endl;

欢迎来到我的博客

功能逐渐完善ing…………….

0%