LeetBook学习笔记/数组与字符串/数组简介

1. 集合、列表和数组

集合一般被定义为:由一个或多个确定的元素所构成的整体。

这很容易理解,高中已经接触过这个概念,举个例子:班里的同学作为一个集合。显然,这是符合集合的定义的

集合的特性之一就是无序性,集合里的元素没有先后顺序之分;第二个特性就是集合里的元素类型不一定要相同

列表(又称线性列表)的定义为:是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。列表的概念是在集合的特征上形成的,它具有顺序,且长度是可变的。这和集合是不同的。列表最常见的表现形式有数组和链表,而栈和队列则是两种特殊类型的列表。

数组是列表的一种表现形式,它有两个最重要的概念:第一个是索引(index),通过索引,我们可以轻松访问数组中的元素。第二个是数组中的元素是连续存储的,且每个元素占用相同大小的内存

2. 数组的操作

3. LC

A 寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

 示例:


输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

 题解代码:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum1 = 0;
        int sum2 = 0;
        for(int i = 0;i < nums.size();i++)
        {
            sum2 = sum2 + nums[i];
        }
        for(int j = 0;j < nums.size();j++)
        {
            if(sum1 == (sum2 - nums[j]))
            {
                return j;
            }
            else
            {
                sum1 = sum1 + nums[j];
                sum2 = sum2 - nums[j];
            }
        }
        return -1;
    }
};

B 寻找数组的中心索引

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例:

输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6], target = 2
输出: 1

题解代码:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size()-1;
    while (left <= right)
    {
        int middle = left + ((right-left)/2);
        if(nums[middle] < target){
            left = middle+1;
        }
        else if (nums[middle] > target)
        {
            right = middle -1;
        }
        else if (nums[middle]==target){
            return middle;
        }
    }
    return right + 1;  
    }
};

C 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

题解代码:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        if(n==1)
            return intervals;
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> vec;
        vec.push_back(intervals[0]);
        int j =0;
        for(int i = j+1;i<n;i++){
            if(intervals[i][0]<=vec[j][1])
                vec[j][1]=max(vec[j][1],intervals[i][1]);
            else{
                vec.push_back(intervals[i]);
                j++;
            }
        }
        return vec;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_50829573/article/details/121445423