每日一题(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. 在当前外层循环确定的元素numsi的基础上,使用两个指针j和k分别指向numsi的下一个元素和数组末尾。
    通过移动j和k,尝试找到与numsi相加最接近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矩阵中的每个元素newij,它将被赋值给matrixjmatrixSize - 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];
        }
    }
}
相关推荐
dtq04246 小时前
数据结构 - 堆
数据结构
nhdh13 小时前
B+树揭秘:MySQL索引核心原理全解析
数据结构·b树·mysql
海上小飞龙13 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂13 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i13 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息15 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.16 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕16 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng17 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆18 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人