数组和字符串-笔记
一、集合,列表与数组
集合: 由一个或多个确定的元素构成的一个整体;
集合特点: 1.集合内的数据是无序的;2.集合内的数据类型不一定相同;
列表: 又称为线性列表,由数据项构成的有限序列,按照一定的线性顺序,排列而成的数据项集合;
列表特点: 1.列表中的数据类型可能不一致;2.列表是按照一定的线性顺序排列的;3长度是可变的;3.列表中的元素在内存中可能是相邻的,也有可能是不相邻的,如列表的另一种实现方式---链表,它的元素在内存中则不一定是连续的;
列表在编程语言中的常见表现形式有数组和链表,栈和队列是两种特殊的链表。
数组: 数组是列表的一种特殊实现形式
数组特点: 1.存储方式是有序的;2.用索引来标示数组中的内容,索引是从下表0开始;3.数组中的元素在内存中是连续的;4,每个数组中的元素占用内存相同;
二、数组的操作
1、读取元素
(1)方式:访问索引(下标)来读取,索引一般从0开始。
(2)过程:先在内存中为数组申请一段连续的空间,并且会记下索引为0处的内存地址,之后由记下的索引为0处内存地址 + 索引值 = 目标元素的地址,即找到目标元素。
(3)时间复杂度:O(1)
2、查找元素
(1)过程:从数组开头逐步向后查找。如果数组中的某个元素为目标元素,则停止查找;否则继续搜索直到到达数组的末尾。
(2)时间复杂度:O(N),N 为数组的长度。
3、插入元素
(1)末尾插入,只需要1步
(2)但是,其他位置,要求其他元素腾出空间,所以首尾间插入用链表省时
4、删除元素
(1)删除掉数组中的某个元素后,数组中会留下空缺的位置,而数组中的元素在内存中是连续的,这就使得后面的元素需对该位置进行填补操作。
(2)时间复杂度:O(N),N 为数组的长度。
注:只考虑最坏情况的时间复杂度
题目
1.中心下标
class Solution{
public int privotIndex(int[] nums){
int total = Arrays.steam(nums).sum();
int sum = 0;
for(int i=0; i<nums.length; i++){
if(2*sum + nums[i] == total){
return i;
}
sum += sum + nums[i];
}
return -1;
}
}
2.搜索插入位置
Class Solution{
public int searchInsert(int[] nums, int target){
int left = 0, right = nums.length-1;
while(left<=right){
int mid = left + (right-left)/2; //防止int溢出
if(nums[mid]==target){
return mid;
}else if(num[mid]<target){
left = mid+1;
}else{
right = mid-1;
}
}
return left;
}
}
```java
public int[][] merge(int[][] intervals){
if(intervals.length == 0){
return new int[0][2];
}
ArrayList<int[]> merged = new ArrayList<>();
Arrays.sort(intervals, (v1,v2) -> v1[0]-v2[0]);
for (int i = 0; i < intervals.length; i++) {
int L = intervals[i][0], R = intervals[i][1];
if(merged.size()==0 || L > merged.get(merged.size()-1)[1]){
merged.add(new int[]{L,R});
}else{
merged.get(merged.size()-1)[1] = Math.max(R, merged.get(merged.size()-1)[1]);
}
}
return merged.toArray(new int[merged.size()][]);
}
3.给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
//对角线翻转
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
//水平翻转
for (int i = 0; i < n; i++) {
for (int j = 0; j < n/2; j++) {
int temp = matrix[i][n-1-j];
matrix[i][n-1-j] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
}