每日一题(4.17)

目录

Leecode-16-最接近的三数之和

题目

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例

示例1

输入:nums = [-1,2,1,-4], target = 1

输出:2

解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例2

输入:nums = [0,0,0], target = 1

输出:0

解题思路

  1. 使用qsort()函数对nums数组进行排序,排序规则为cmp函数定义的升序
  2. sum:用于存储当前三个数的和。
    flag:用于存储最接近目标值的和,初始化为一个较大的数(1e7)
  3. 使用一个外层循环遍历数组nums,跳过重复的元素,避免重复计算
  4. 在当前外层循环确定的元素nums[i]的基础上,使用两个指针j和k分别指向nums[i]的下一个元素和数组末尾。
    通过移动j和k,尝试找到与nums[i]相加最接近target的两个数。
    · 如果sum等于target,直接返回target。
    · 如果abs(sum - target)小于abs(flag - target),更新flag。
    根据sum和target的大小关系,移动指针j或k,并跳过重复的元素
  5. 返回最接近目标值的和flag

代码实现

c 复制代码
int cmp(const void* a,const void* b){
    return *(int*)a-*(int*)b;
}

int threeSumClosest(int* nums, int numsSize, int target) {
    int sum = 0;
    qsort(nums,numsSize,sizeof(int),cmp);
    int flag = 1e7;

    int i,j,k;
    for(i = 0;i < numsSize ; i++){
        if(i > 0 && nums[i] == nums[i - 1]){
            continue;
        }
        j = i + 1;
        k = numsSize - 1;
        while(j < k){
            sum = nums[i] + nums[j] + nums[k];
            if (sum == target) {
                return target;
            }
            if (abs(sum - target) < abs(flag - target)) {
                flag = sum;
            }
            if(sum > target){
                int num2 = nums[k];
                k = k - 1;
                while(j < k && nums[k] == num2){
                    k--;
                }
            }else{
                int num1 = nums[j];
                j = j + 1;
                while(j < k && nums[j] == num1){
                    j++;
                }
            }
        }
    }
    return flag;
}

Leecode-面试题01.07-旋转矩阵

题目

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

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

示例

示例1

给定 matrix =

[

[1,2,3],

[4,5,6],

[7,8,9]

],

原地旋转输入矩阵,使其变为:

[

[7,4,1],

[8,5,2],

[9,6,3]

]

示例2

给定 matrix =

[

[ 5, 1, 9,11],

[ 2, 4, 8,10],

[13, 3, 6, 7],

[15,14,12,16]

],

原地旋转输入矩阵,使其变为:

[

[15,13, 2, 5],

[14, 3, 4, 1],

[12, 6, 8, 9],

[16, 7,10,11]

]

解题思路

  1. 创建临时矩阵:首先,函数创建了一个与原始矩阵matrix同样大小的临时矩阵new,并将原始矩阵中的元素复制到临时矩阵new中
  2. 旋转矩阵:接下来,函数再次通过两个嵌套的for循环遍历临时矩阵new的每一个元素。对于new矩阵中的每个元素new[i][j],它将被赋值给matrix[j][matrixSize - i - 1]。这个操作实现了矩阵的顺时针旋转90度。具体来说,如果原始矩阵中的某个元素位于第i行第j列,那么在旋转后的矩阵中,它应该位于第j行第(matrixSize - i - 1)列

代码实现

c 复制代码
void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    int new[matrixSize][matrixSize];
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++) {
            new[i][j] = matrix[i][j];
        }
    }
    for (int i = 0; i < matrixSize; ++i) {
        for (int j = 0; j < matrixSize; ++j) {
            matrix[j][matrixSize - i - 1] = new[i][j];
        }
    }
}
相关推荐
jiao_mrswang43 分钟前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子1 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!1 小时前
【优选算法】二分查找
c++·算法
王燕龙(大卫)1 小时前
leetcode 数组中第k个最大元素
算法·leetcode
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
盼海3 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou6 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot