每日一题(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];
        }
    }
}
相关推荐
风中的微尘3 小时前
39.网络流入门
开发语言·网络·c++·算法
西红柿维生素4 小时前
JVM相关总结
java·jvm·算法
ChillJavaGuy6 小时前
常见限流算法详解与对比
java·算法·限流算法
散1126 小时前
01数据结构-01背包问题
数据结构
sali-tec6 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
消失的旧时光-19436 小时前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww6 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
你怎么知道我是队长7 小时前
C语言---循环结构
c语言·开发语言·算法
艾醒7 小时前
大模型面试题剖析:RAG中的文本分割策略
人工智能·算法
苏小瀚8 小时前
[数据结构] 排序
数据结构