Lootcode数组和字符串学习笔记C++篇

数组和字符串

数组简介

寻找数组的中心索引

题目要求
  • 给你一个整数数组 nums ,请计算数组的 中心下标 。

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

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

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

解法-要点

psum*2 + nums[i] == sum。即此位置前所有元素的2倍加上此位置的元素等于数组所有的和。

代码
class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum = 0,psum=0;
        for (int i : nums)	// 求和
        {
            sum += i;
        }
        
        for(int i =0;i<nums.size();i++){
            if(psum*2 + nums[i] == sum){	//比对
                return i;
            }
            psum +=nums[i];
        }

        return -1;
    }
};

搜索插入位置

题目要求

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

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

算法-要点

采用二分法,如果查到到返回middle(中间位置);循环判断条件( start <= end );最后返回start。

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

合并区间

题目要求

以数组 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].
算法-要点

对原来区间进行排序,新建一个列表vec保存新的集合信息。将第一条集合加入新节点,比对下一个节点(区间)的左值是否大于新节点的右值。如果大于将此区间加入新集合。如果小于修改vec的右值为vec原来右值和原区间的右值的最大值。

代码
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]);    // 先将第一个区间加入

        // i从1开始控制原数组 j从零开始控制新数组
        for (int i = 1, j = 0; i < intervals.size(); 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;
    }
};

二维数组简介

旋转矩阵

题目描述

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

解法-要点

使用辅助空间存储数据。matrix_new[j][n - i - 1] = matrix[i][j];

n - i - 1:从大到小。i:从小到大

解法-代码
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        // C++ 这里的 = 拷贝是值拷贝,会得到一个新的数组
        auto matrix_new = matrix;
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                matrix_new[j][n - i - 1] = matrix[i][j];
            }
        }
        // 这里也是值拷贝
        matrix = matrix_new;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去留意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值