数组和字符串-笔记

一、集合,列表与数组

集合: 由一个或多个确定的元素构成的一个整体;
集合特点: 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;
            }
        }
    }
}
posted @ 2021-10-09 16:23  jiangwg  阅读(41)  评论(0编辑  收藏  举报