【力扣探索】数组和字符串——数组

数组

数组、集合、列表

集合:由一个或多个元素所构成的整体,其特性在于元素类型不一定相同,其中的元素没有顺序。事实上,这样的集合并不直接存在于编程语言中。然而,实际编程语言中的很多数据结构,就是在集合的基础上添加了一些规则形成的。
列表:数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。它具有顺序,且长度是可变的。在编程语言中,常见的列表形式有数组和链表,栈和队列是两种特殊的列表。
数组:列表没有索引,数组有索引。数组在内存中连续存储,列表不一定(例如链表)

数组常见操作

读取元素:时间复杂度O(1), 索引N地址 = 索引0地址+N
查找元素:时间复杂度O(n), (查找是想知道在数组中是否存在某个元素,读取则是提供索引访问)
插入元素:时间复杂度O(n), 插入后需后移后继元素
删除元素:时间复杂度O(n), 删除后需前移后继元素

练习

以下习题并无所谓技巧可言,按照正常的思路解决即可

1. 寻找数组的中心索引

题目链接: 724.寻找数组的中心索引.
解题思路:遍历数组求和,再次遍历用一个全局变量记录每个元素的前缀和,再判断更新。
代码

class Solution {
   
public:
    int pivotIndex(vector<int>& nums) {
   
    	int sum = 0;
    	for(auto it = nums.begin(); it < nums.end(); ++it){
   
    		sum += *it;
    	}
    	int standard = 0;
    	for(int i = 0; i < nums.size(); ++i){
   
    		if(2*standard == sum-nums[i]){
   
    			return i;
    		}
    		standard += nums[i];
    	}
    	return -1;
    }
};

2. 搜索插入位置

题目链接: 35.搜索插入位置.
解题思路:不用怀疑,直接二分搜索
代码

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

3. 合并区间

题目链接: 56.合并区间.
解题思路:正常思路,排序后遍历比较具体的某元素right与下一个元素left之间的关系
代码

class Solution {
   
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
   
    	if(intervals.size() == 0) return {
   };
    	<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值