打卡leetcode第15天

本文介绍了使用动态规划和贪心法解决一系列编程问题,包括买卖股票的最佳时机、买卖股票的最佳时机之2、单词搜索、轮转数组、快慢指针以及翻转字符串中的单词。通过实例分析,阐述了每种算法的思路和实现方式,帮助读者深入理解这两种常见算法在实际问题中的应用。

目录

1.买卖股票的最佳时机

2.买卖股票的最佳时机之2

3.单词搜索

4.轮转数组

5.快慢指针

6.翻转字符串中的单词3


1.买卖股票的最佳时机

【题目】

【分析】动态规划——贪心法

1:因为严格按照时间的先后顺序执行,一定要先买,在卖
2:遍历数组维护两个变量最大的利润和min最小价格。
3:如果当前价格小于最小的值min时,更新min的值。
4:当前价格与最小值min得差值大于ans时,更细ans的值
3:返回ans的值
时间复杂度:O(n)
空间复杂度:O(1)

int maxProfit(int* prices, int pricesSize){
    int min=prices[0],ans=0;
    for(int i=0;i<pricesSize;++i){
        if(prices[i]<min){
            min=prices[i];
        }
        if(ans<prices[i]-min){
            ans=prices[i]-min;
        }
    }
    return ans;
}

2.买卖股票的最佳时机之2

【题目】

【分析】贪心法

int maxProfit(int* prices, int pricesSize) {
    int ans = 0;
    for (int i = 1; i < pricesSize; ++i) {
        ans += fmax(0, prices[i] - prices[i - 1]);
    }
    return ans;
}


3.单词搜索

【题目】

 

【分析】

bool DFS(char** board, bool **visited,  int rows, int cols, int i, int j, char * word, int index) {
    if (i < 0 || j < 0 || i >= rows || j >= cols || visited[i][j] || board[i][j] != word[index]) {
        return false;
    }

    if (index == strlen(word) - 1) {
        return true;
    }
    visited[i][j] = true;
    bool res = DFS(board, visited, rows, cols, i + 1, j, word, index + 1) ||
               DFS(board, visited, rows, cols, i - 1, j, word, index + 1) ||
               DFS(board, visited, rows, cols, i, j + 1, word, index + 1) ||
               DFS(board, visited, rows, cols, i, j - 1, word, index + 1);
    visited[i][j] = false;
    return res;
}
bool exist(char** board, int boardSize, int* boardColSize, char * word){
    bool **visited = (bool **)calloc(boardSize, sizeof(bool *));
    for (int i = 0; i < boardSize; i++) {
        visited[i] = (bool *)calloc(boardColSize[i], sizeof(bool));
    }
    for (int i = 0; i < boardSize; i++) {
        for (int j = 0; j < boardColSize[i]; j++) {
            if (DFS(board, visited, boardSize, boardColSize[i], i, j, word, 0)) {
                return true;
            }
        }
    }
    return false;
}

int r,c,wordLen;
bool check;
void backTracking(char** board,bool visited[][c],char* word,int index,int i,int j)
{
    if(i<0||i>=r||j<0||j>=c||visited[i][j]||check||word[index]!=board[i][j])
        return;//如果下标越界或者匹配成功(check=true)或者单词不匹配就返回
    if(index+1==wordLen)//不满足上面说明匹配成功,此时看是否已匹配完word
        check=true;
    visited[i][j]=true;//设置当前节点为已访问
    backTracking(board,visited,word,index+1,i+1,j);//分别向四个方向进行回溯
    backTracking(board,visited,word,index+1,i-1,j);
    backTracking(board,visited,word,index+1,i,j+1);
    backTracking(board,visited,word,index+1,i,j-1);
    visited[i][j]=false;//返回先前状态
}

//主函数就不解释了
bool exist(char** board, int boardSize, int* boardColSize, char * word){
    bool** visited[boardSize][boardColSize[0]];
    r=boardSize,c=boardColSize[0],wordLen=strlen(word),check=false;
    memset(visited,0,sizeof(visited));
    for(int i=0;i<r;i++)
        for(int j=0;j<c;j++)
        {
            backTracking(board,visited,word,0,i,j);
            if(check)
                return true;
        }
    return false;
}

4.轮转数组

【题目】

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

【分析】

法1:使用额外的数组将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组下标为 iii 的元素放至新数组下标为 (i+k) mod n的位置,最后将新数组拷贝至原数组即可。

void rotate(int* nums, int numsSize, int k) {
    int newArr[numsSize];
    for (int i = 0; i < numsSize; ++i) {
        newArr[(i + k) % numsSize] = nums[i];
    }
    for (int i = 0; i < numsSize; ++i) {
        nums[i] = newArr[i];
    }
}

法2:数组翻转

void swap(int* a, int* b) {
    int t = *a;
    *a = *b, *b = t;
}

void reverse(int* nums, int start, int end) {
    while (start < end) {
        swap(&nums[start], &nums[end]);
        start += 1;
        end -= 1;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;
    reverse(nums, 0, numsSize - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, numsSize - 1);
}

5.快慢指针

题目

分析

法1:单链表遍历法

struct ListNode* middleNode(struct ListNode* head){
      int len=0;//表长
      int j=0;
      struct ListNode* cur=head;//指向链表头
      while(cur!=NULL){
          cur=cur->next;
          len++;
      }//找链表长度
      cur=head;//重新指向链表头
      while(j<len/2&&cur!=NULL){
          cur=cur->next;
          j++;
      }
      return cur;
      
}

法2:快慢指针

以1 2 3 4 5 6 为例,i代表慢指针(每次移动1步),j代表快指针(每次移动2步)。
(1)刚开始i和j都指向头节点
1 2 3 4 5 6
i
j
(2)第一轮移动快慢指针后i和j的位置
1 2 3 4 5 6
  i
    j
(3)第二轮移动快慢指针后i和j的位置	
1 2 3 4 5 6
    i
        j
(4)第三轮移动快慢指针后i和j的位置(当j移动到链表尾部NULL时,i刚好是答案)	
1 2 3 4 5 6 NULL
      i
             j


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* fast=head;//快指针一次走两步
    struct ListNode* slow=head;//慢指针一次走一步
    while(fast!=NULL&&fast->next!=NULL){//也要判断下一个是不是为空指针
         slow=slow->next;
         fast=fast->next->next;
    }
    return slow;
}

6.翻转字符串中的单词3

【题目】

【分析】

直接在原字符串上进行操作,避免额外的空间开销。当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符……如此反复,就可以在原空间上翻转单词

char * reverseWords(char * s){
     int length=strlen(s);
     int left,right;
     int start;
     int i=0;
     while(i<length){
       start=i;
       while(i<length&&s[i]!=' '){
           i++;
       }
        left=start;
        right=i-1;
        while(left<right){
           char tmp=s[left];
            s[left]=s[right];
            s[right]=tmp;
            left++;
            right--;
        }
        while(i<length&&s[i]==' '){
            i++;
        }
        
       }
       return s;
     }

内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
内容概要:本文围绕基于静态约束法的配电网电动汽车接入容量评估展开研究,提出了一种在新型电力系统背景下评估主动配电网对电动汽车承载能力的方法。研究通过构建数学模型,结合潮流计算与关键约束条件(如电压越限、线路过载等),量化分析配电网可承受的最大电动汽车充电负荷容量,旨在识别规模化电动汽车接入带来的潜在运行风险,并为电网规划与运行提供科学依据。文中配套提供了完整的Matlab代码实现,便于仿真验证与结果复现。此外,该研究与分布式光伏承载力评估、电动汽车可调能力分析等方向形成技术联动,展现了多主题协同的研究体系。; 适合人群:具备电力系统分析基础理论知识及Matlab编程能力的高校研究生、科研机构研究人员,以及从事新能源并网、智能配电网规划与运行等相关领域的工程技术人员。; 使用场景及目标:①用于学术研究中的模型复现与论文撰写支撑;②评估实际配电网中电动汽车大规模接入的可行性与安全边界,指导充电基础设施布局;③作为高校教学案例,帮助学生深入理解电网承载力评估的核心原理、建模方法与仿真技术; 阅读建议:建议结合文中提及的相关研究方向(如二阶锥规划、多面体聚合方法等)进行对比学习,充分利用所提供的Matlab代码与网盘资料开展仿真实验,重点关注约束条件的设定逻辑与潮流计算模块的实现细节,以深化对评估模型机理与工程应用价值的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值