做题日记1

简介: 最小值一定在序列A这里面如果A序列为升序则A序列的第一个就是最小值,所以每次二分取得中间值与最右边的值进行比较然后就能找到最小值了。

一.计算日期到天数转换


6bdf3ff9062d44d1912bc2b63ecb41c1.png


注意点:


1.年份为四位数,日期要合法。

2.要考虑闰年2月多少天。


我们可以用一个数组来存放12个月中的日期,Month[12],


1、3、5、7、8、10、12 每月31天,4、6、9、11为30天。 二、2月正常为28天,如果为闰年,则多一天为29天。则把12个月的天数一一填进去。


Month[12]={31,28,31,30,31,30,31,31,30,31,30,31};


然后再讨论闰年的情况。


if(year%4==0&&year%100!=0||year%400==0)
{
       Month[1]++//如果是闰年那么二月就变成29天了。
}


那么该月到现在有多少天呢?


int i;
for(i=0;i<month;i++)
{
   daycount=daycount+Month[month-1];
}
然后再加上本月已经过的那几天
daycount+=day;


代码如下


int main()
{
  int year, m;
  int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  int day;
  scanf("%d%d%d", &year, &m, &day);
  if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
  {
    month[1]++;
  }
  int daycount = 0;
  int i;
  for (i = 0;i < m - 1;i++)
  {
    daycount += month[i];
  }
  daycount += day;
  printf("%d", daycount);
  return 0;
}


二. 旋转数组的最小数字


b9de122c867d4d88a34bd5b97418a2c3.png



36dafc5996954acca17ab1a6267fff74.png


旋转数组:打比方把A段搬到B段后面就变成了下面这样:


287951a6a16f49f78bc24a7cbc6d17f0.png


要求在这里找到最小值该如何找呢?


一.暴力求解:主要对数组遍历取最小数


1.特殊情况,如果数组为空,则直接返回0

2.创建最小值mins,可以是数组第一个也可以是int最大数

3.遍历数组每个元素arr[i],并更新最小值mins=min(mins,arr[i])

4.遍历结束,直接返回mins.


**
 * 
 * @param rotateArray int整型一维数组 
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 */
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen )
 {   int mins=rotateArray[0];
     int i;
     for(i=0;i<rotateArrayLen;i++)
     {
       if(rotateArray[i]<mins)
       {
        mins=rotateArray[i];
       }
     }
    // write code here
     return mins;
}


二.二分法:排序数组的查找问题首先考虑使用 二分法 解决。


最小值一定在序列A这里面如果A序列为升序则A序列的第一个就是最小值,所以每次二分取得中间值与最右边的值进行比较然后就能找到最小值了。


9f6943ca41d24d0dac897322f68b1046.png

60c91aeb8f914cc0adba1f8e1a5ddfeb.png



/**
 * 
 * @param rotateArray int整型一维数组 
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 */
int minNumberInRotateArray(int arr[], int rotateArrayLen )
{    
    int left=0;
    int right=rotateArrayLen-1;
    while(left < right)
    {
       int mid=(left+right)/2;
       if(arr[mid]>arr[right])
       {
          left=mid+1;
       }
       else if(arr[mid]==arr[right])
       {
        right--;
       }
       else
       {
           right=mid;
       }
    }
    return arr[left];
    // write code here
}


三.二分查找-I


ec5248d68e6e43afab728045924b1509.png


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @param target int整型 
 * @return int整型
 */
int search(int* nums, int numsLen, int target ) 
{
    int left=0;
    int right=numsLen-1;
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(nums[mid]==target)
        {
             return mid;
        }
        else if (nums[mid]<target)
        {
             left=mid+1;
         }
        else
        {
             right=mid-1;
        }
    }
       return -1;
    // write code here
}


最基本的二分查找。


四. 二维数组中的查找


是一维数组二分查找的进一步扩展到二维上


048b720369364be781c19350350545a3.png


这个就每行都进行二分查找。4行就四次二分查找。


b0d5cee60ebb4a50b6f7b0c0427863a6.png


两种思路
一种是:
把每一行看成有序递增的数组,
利用二分查找,
通过遍历每一行得到答案,
时间复杂度是nlogn
public class Solution {
    public boolean Find(int [][] array,int target) {
        for(int i=0;i<array.length;i++){
            int low=0;
            int high=array[i].length-1;
            while(low<=high){
                int mid=(low+high)/2;
                if(target>array[i][mid])
                    low=mid+1;
                else if(target<array[i][mid])
                    high=mid-1;
                else
                    return true;
            }
        }
        return false;
    }
}
另外一种思路是:
利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
即row++;
public class Solution {
    public boolean Find(int [][] array,int target) {
        int row=0;
        int col=array[0].length-1;
        while(row<=array.length-1&&col>=0){
            if(target==array[row][col])
                return true;
            else if(target>array[row][col])
                row++;
            else
                col--;
        }
        return false;
    }
}


相关文章
|
关系型数据库 MySQL Unix
【Linux系统】关于守护进程
在某家公司工作期间,会使用常驻进程来作为需要保活运行的机制,用以维护消费者进程。但当时对于守护进程的理解还是不够深入,所以现在再把这块做个整理,并结合当时遇到的一个问题实例进行分析。注:下面内容都针对Linux操作系统。(Mac上的launchd与systemd作用相同,而且据说systemd的很多概念来自launched)。
420 0
|
11月前
|
设计模式 前端开发 数据安全/隐私保护
前端必须掌握的设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过引入“替身”对象来间接访问真实对象,从而解耦并提升性能和安全性。例如,知名艺人复出后,经纪人作为代理筛选商单,确保只处理符合团队利益的请求。代码实现中,定义接口`IService`,艺人和经纪人都实现该接口,经纪人在访问时进行过滤和转发。代理模式常用于权限控制、性能优化等场景,如前端中的Tree-shaking和ES6的Proxy构造方法。
前端必须掌握的设计模式——代理模式
|
Java
java的继承详解
在 Java 中,继承是一个核心概念,它允许子类 `extends` 父类来重用和扩展其属性与方法。子类可以覆盖父类的方法以改变行为,同时使用 `super` 关键字调用父类的构造方法或方法。虽然 Java 不支持多继承,但可以利用抽象类与接口实现多层继承。这种方式极大地增强了代码的复用性和维护性。
253 2
|
Windows
|
分布式计算 Hadoop 大数据
大数据处理框架在零售业的应用:Apache Hadoop与Apache Spark
【8月更文挑战第20天】Apache Hadoop和Apache Spark为处理海量零售户数据提供了强大的支持
291 0
什么是子网划分?
【8月更文挑战第24天】
608 0
|
SQL XML Java
IDEA常用插件及配置-解放双手
IDEA常用插件及配置-解放双手
504 1
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
30156 1
|
人工智能 前端开发 决策智能
【AI Agent系列】【MetaGPT多智能体学习】5. 多智能体案例拆解 - 基于MetaGPT的智能体辩论(附完整代码)
【AI Agent系列】【MetaGPT多智能体学习】5. 多智能体案例拆解 - 基于MetaGPT的智能体辩论(附完整代码)
679 0
|
NoSQL 关系型数据库 MySQL
Redis协议与异步方式
Redis协议与异步方式
338 0