数组

定义:

数组是存放在连续内存空间上的相同类型数据的集合。

知识

  1. C++:int类型4字节float类型在32位中是4字节 在64位中是8字节
  2. Java的一维数组是连续的,二维数组在内存中不是连续地址空间
  3. 右移一维相当于除以2
  4. k–是最后减去k=1 i=k–;之后i=1,k=0

题目

二分法

前提是数组为有序数组,同时题目还强调数组中无重复元素,解决思路:两个边界,让左边界小于等于右边界通过比较mid与目标的值,来修改两个边界,直到找到目标值。

https://leetcode.cn/problems/binary-search/

Q:二分的边界应该如何判断?

优势1:因为取mid值时已经对比了和目标值的是否匹配,所以在之后确定边界时可以加一减一操作

1
2
3
4
5
6
7
if (guess == target) {
return midOfIndex;
} else if (guess < target) {
minOfIndex = midOfIndex + 1;
} else {
maxOfIndex = midOfIndex - 1;
}

优势2:在while循环中设置一个小于等于,就可以在最后一次判断是否等于边界

例如{0,1,2,3,4}找4

right_index:0 left_index:4

right_index:3 left_index:4

right_index:4 left_index:4

Q:奇数和偶数数组有没有必要考虑?一个数的数组有没有必要考虑

其他方法需要,上述代码不用

双指针法

特点是通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。,主要问题就是两个指针的作用,一个用于寻找想要的值,一个用与确定目前索引

有两种实现一种是从两边开始,while保证left<=right;从一边开始 index<length

  • 暴力解法时间复杂度:O(n^2)
  • 双指针时间复杂度:O(n)

https://leetcode.cn/problems/remove-element/description/

https://leetcode.cn/problems/squares-of-a-sorted-array/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution2 {
public int removeElement(int[] nums, int val) {
int fast_Index = 0;
int slow_Index = 0;
while(fast_Index < nums.length){
if(nums[fast_Index] != val){
nums[slow_Index] = nums[fast_Index];
slow_Index++;
}
fast_Index++;
}
return slow_Index;
}
}

滑动窗口

滑动窗口的思想就是两个指针前边指针用于确定窗口大小,后边指针用于缩小窗口以此为一个循环。循环到底是前指针指到最后。

也可以用于解决失败超时问题

  • 暴力解法时间复杂度:O(n^2)
  • 滑动窗口时间复杂度:O(n)

模拟

遵循循环不变量原则,这样就可以保证,每个边循环次数固定,比如如图所示每个边循环都是2 这样写起来就很简答。

image-20240123113812955
Author

jzs

Posted on

2024-01-23

Updated on

2024-04-29

Licensed under

Comments