源码合集(day1 - day 11)

因为发觉每次贴代码的都是图片,不好直接copy,下面是这十一天来的题目链接及源码

DAY1

力扣题

19.删除链表的倒数第N个节点

题目链接:. - 力扣(LeetCode)

 左闭右闭

// 版本一
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
        while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
            int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
            if (nums[middle] > target) {
                right = middle - 1; // target 在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        // 未找到目标值
        return -1;
    }
};

左闭右开 

// 版本二
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
        while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左区间,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        // 未找到目标值
        return -1;
    }
};

34.在排序数组中查找元素的第一个位置和最后一个位置

题目链接:. - 力扣(LeetCode)

二分查找 + 双指针法

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

27. 移除元素

题目链接:. - 力扣(LeetCode)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i, j;
        for(i = 0, j = 0; j < nums.size(); j ++)
          if(nums[j] != val) nums[i++] = nums[j];
        return i;
    }
};

DAY2 

力扣题

209.长度最小的子数组

题目链接:. - 力扣(LeetCode)

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int answer, i, t, sum;
        sum = nums[0];
        for(i = 0, answer = 0, t = 0, sum; i < nums.size(); i ++, t --)
        {
            while(sum < target)
            {
                t ++;
                if(i + t >= nums.size())break;
                sum += nums[i + t];
            }
            if((i + t < nums.size() && answer == 0) || (i + t < nums.size() && answer > t)) answer = t + 1;
            sum -= nums[i];
        }
        return answer;
    }
};

59.螺旋矩阵II

题目链接:. - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> a(n, vector<int>(n, 0));

    	int x = 0, y = 0, i = 2, n0 = n - 1, m = n, t = 0;
        a[0][0] = 1;
	    while(i <= n * n)
        {
            if(t == 0) 
            {
                while(n0 --) a[x][++y] = i++;
                n0 = m - 1, t = 1;
            }
            if(t == 1)
            {
                while(n0 --) a[++x][y] = i ++;
                n0 = m - 1, t = 2;
            }
            if(t == 2)
            {
                while(n0 --) a[x][--y] = i ++;
                m --, n0 = m - 1,  t = 3;
            }
            if(t == 3)
            {
                while(n0 --) a[--x][y] = i ++;
                n0 = m - 1, t = 4;
            }
            if(t == 4)
            {
                while(n0 --) a[x][++y] = i ++;
                m --, n0 = m - 1, t = 1;
            }
        }
        return a;
    }
};

卡码网题部分

58 区间和

题目链接58. 区间和(第九期模拟笔试)

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int nums[100006] = {0};
    int n, i, begin, end, x;
    cin>>n;
    nums[0] = 0;
    for(i = 1; i <= n; i ++)
    {
        cin>>x;
        nums[i] = x + nums[i - 1]; 
    }
    while(cin>>begin>>end)
    {   	
        cout<<nums[end + 1] - nums[begin]<<endl;        
    }
    return 0;
}

44.开发商购买土地(八月三日补充)

题目链接:44. 开发商购买土地(第五期模拟笔试)

#include<bits/stdc++.h>
using namespace std;
int map1[100][100];
int map2[100][100];
int totalsum1[100];
int totalsum2[100];
int main()
{
    int i, j, m, n, A, B, x, ans, d;
    cin>>n>>m;
    for(int i = 0; i < n; i ++)
    {
        for(int j = 0; j < m; j ++)
        {
            cin>>x;
            if(i == 0)map1[i][j] = x;
            else map1[i][j] = map1[i - 1][j] + x;
            if(j == 0)map2[i][j] = x;
            else map2[i][j] = map2[i][j - 1] + x;
        }
    }
    totalsum1[0] = map1[n - 1][0];
    totalsum2[0] = map2[0][m - 1];
    for(j = 1;j < m; j ++)
        totalsum1[j]= map1[n - 1][j] + totalsum1[j - 1];
    for(i = 1; i < n; i ++)
        totalsum2[i] = map2[i][m - 1] + totalsum2[i - 1];
    for(i = 0,ans = -1; i < m; i ++)
    {
        A 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值