每日一题(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];
        }
    }
}
相关推荐
Wo3Shi4七4 分钟前
数组
数据结构·算法·go
CoovallyAIHub11 分钟前
YOLOv13都来了,目标检测还卷得动吗?别急,还有这些新方向!
深度学习·算法·计算机视觉
北方有星辰zz16 分钟前
数据结构:栈
java·开发语言·数据结构
zl_dfq22 分钟前
数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)
数据结构
转转技术团队44 分钟前
边学边做:图片识别技术的学习与应用
后端·算法
一块plus1 小时前
2025 年值得一玩的最佳 Web3 游戏
算法·设计模式·程序员
前端拿破轮1 小时前
不是吧不是吧,leetcode第一题我就做不出来?😭😭😭
后端·算法·leetcode
一块plus1 小时前
什么是去中心化 AI?区块链驱动智能的初学者指南
人工智能·后端·算法
Mr_Xuhhh1 小时前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法
前端拿破轮1 小时前
😭😭😭看到这个快乐数10s,我就知道快乐不属于我了🤪
算法·leetcode·typescript