每日一题(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];
        }
    }
}
相关推荐
独好紫罗兰8 分钟前
洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构
开发语言·python·算法
独好紫罗兰14 分钟前
洛谷题单2-P1424 小鱼的航程(改进版)-python-流程图重构
开发语言·python·算法
qystca1 小时前
蓝桥云客---九宫幻方
算法·深度优先·图论
明月清了个风2 小时前
数据结构与算法学习笔记----贪心区间问题
笔记·学习·算法·贪心算法
努力毕业的小土博^_^2 小时前
【EI/Scopus双检索】2025年4月光电信息、传感云、边缘计算、光学成像、物联网、智慧城市、新材料国际学术盛宴来袭!
人工智能·神经网络·物联网·算法·智慧城市·边缘计算
神里流~霜灭2 小时前
数据结构:二叉树(三)·(重点)
c语言·数据结构·c++·算法·二叉树·红黑树·完全二叉树
网安秘谈2 小时前
非对称加密技术深度解析:从数学基础到工程实践
算法
luckyme_2 小时前
leetcode-代码随想录-哈希表-有效的字母异位词
算法·leetcode·散列表
zh_xuan2 小时前
LeeCode 57. 插入区间
c语言·开发语言·数据结构·算法
莫有杯子的龙潭峡谷2 小时前
4.4 代码随想录第三十五天打卡
c++·算法