Leetcode解题记录系列(1)

leetcode解题记录(1)

简单记录leetcode刷题过程。

1、两数之和

**题目描述:**给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。
C++暴力解法:

class Solution{
    public:
    vector<int> twoSum(vector<int>& nums,int target){
        int i=0,j=0;
        int size=nums.size();
        for(i=0;i<size-1;i++){
            for(j=i+1;j<size;j++){
                if(nums[i]+nums[j]==target){	//若存在两数满足条件
                    return {i,j};				//返回数组下标
                    break;
                }
            }
        }
        return{i,j};
    }
};

暴力解法的思路比较简单,基本就是在数组中用两层循环寻找符合条件的答案;
时间复杂度:O(N^2);空间复杂度:O(1);
两遍Hash方法:
Hash表的方法就是将元素一一对应,就是建立一个映射关系;C++代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> a;//建立hash表存放数组元素
        vector<int> b(2,-1);//存放结果
        for(int i=0;i<nums.size();i++)
            a.insert(map<int,int>::value_type(nums[i],i));	//按一定格式存入map
        for(int i=0;i<nums.size();i++)
        {
            if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))
            //count==1表示找到和为target的两个元素;判断是否找到目标元素且目标元素不能是本身
            {
                b[0]=i;
                b[1]=a[target-nums[i]];
                break;
            }
        }
        return b;
    };
};

因为map中有函数count,可以直接找到合适的元素,故不用再用依次循环搜索;
map容器的使用:🔗:https://www.cnblogs.com/yonglin1998/p/11780828.html
示例代码如下:

#include<map>
#include<string>
#include<iostream>
using namespace std;
int main() {
	map<int, string> mapStudent;//creat a map,its element consists an int and an string
	mapStudent.insert(pair<int, string>(1, "student_one"));//map's insert operation
	mapStudent.insert(pair<int, string>(3, "student_two"));
	mapStudent.insert(pair<int, string>(4, "student_three"));
	map<int, string>::iterator iter;//creat a map pointer to point a element in a map
	for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
		cout << iter->first << "  " << iter->second << endl;//output operation
	}
}

运行结果如下:
在这里插入图片描述
一般称map的第一个元素为关键字(int型),第二个元素为对应关键字的值(string或者int型)
一边插入一遍搜索的方法:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> hash;
        vector<int> b;//存放结果
        hash.insert(map<int,int>::value_type(nums[0],0));//将第一个元素插入hash

        for(int i=1;i<nums.size();i++){
            hash.insert(map<int,int>::value_type(nums[i],i));
            if((hash.count(target-nums[i])>0)&&(hash[target-nums[i]]!=i)){
                b.push_back(hash[target-nums[i]]);
                b.push_back(i);
                return b;
            }
        }
        return b;
    };
};

26、删除排序数组中的重复项

题目描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

我的方法由于是sorted array,所以是比较简单的,我的方法是遍历array中的每一个元素,当这个元素和其前一个元素的值不相等时,返回的cnt就++,然后修改原array对应位置的value即可,c++代码如下:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0){
            return 0;
        }
        int cnt=1;
        for(int i=1;i<nums.size();i++){
            if(nums[i]!=nums[i-1]){
                cnt++;
                nums[cnt-1]=nums[i];
            }
        }
        return cnt;
    };
};

双指针解法
设置快慢指针,快指针和慢指针指向内容不同时,就可以改变数组中内容了:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty())
         return 0; // 数组为空的判断
        int slow = 0,fast=0;	//快慢指针
            for ( fast = 0; fast < (nums.size() - 1); fast++){
            if(nums[fast] != nums[fast + 1]) { // 发现和后一个不相同
                nums[++slow] = nums[fast + 1]; //slow = 0 的数据一定是不重复的,所以直接 ++slow
            }
        }
        return slow + 1; //slow是从0开始的,所以返回slow + 1
    }
};

C语言版:

int removeDuplicates(int* nums, int numsSize){
if(numsSize==0){
            return 0;
        }
        int cnt=1;	//用于记录非重复元素数目
        int *fast;int*slow;	//快慢指针
        slow=nums;	//慢指针直接指向数组首元素
        fast=slow+1;	//快指针指向第2个元素
        for(;fast<(nums+numsSize);fast++){
            if(*fast!=*slow){	//快慢指针指向内容
                cnt++;
                nums[cnt-1]=*fast;
                slow=fast;
            }
        }
        return cnt;
}

只要记住双指针这个思路就好!

移除元素

题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

我的解法:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        if(nums.size()==0){
            return 0;
        }
        int cnt;
        for(int i=0;i<nums.size();i++){
            if(nums[i]!=val){	//若不等于val
                cnt++;			//计数增加
                nums[cnt-1]=nums[i];//改变数组的值
            }
        }
        return cnt;
    };
};

双指针的解法
思路是让一个快指针在前面探路寻找值不等于val的位置,然后复制后放到慢指针的位置。
C++解法:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        if(nums.empty()){return 0;}
        int slow=0, fast=0;//快慢指针定义
        int cnt=0;			//用于计数
        for(fast=0;fast<=nums.size()-1;fast++){
           if(nums[fast]!=val){//不等于时,需要的操作是赋值,计数,slow移动
               cnt++;
               nums[slow]=nums[fast];
               slow++;
           }
           if(nums[fast]==val){//等于时不需要任何操作,继续移动fast即可

           }
        }
        return cnt;
    }
};

35、搜索插入位置

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

你可以假设数组中无重复元素。
暴力解法:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        if(target<nums[0]){
            return 0;
        }
        
        for(int i=0;i<nums.size();i++){
            if(i!=nums.size()-1){if((target>nums[i])&&(target<nums[i+1])){
                return i+1;
            }}
            if(target==nums[i]){
                return i;
            }
        }
        return nums.size();
    };
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值