精华内容
下载资源
问答
  • 1.暴力,有点冒泡排序思想的感觉,一次确定一个最小的数,只不过这个数的确定方式是什么呢,一种可以考虑的方式是这个数和另一个数做一个组合观察放在前面还是后面即可判断! 2.自定义排序,本质就是抽象的一个排序...

    输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

    示例 1:

    输入: [10,2]
    输出: "102"

    示例 2:

    输入: [3,30,34,5,9]
    输出: "3033459"

    1.暴力,有点冒泡排序思想的感觉,一次确定一个最小的数,只不过这个数的确定方式是什么呢,一种可以考虑的方式是这个数和另一个数做一个组合观察其放在前面还是后面即可判断!

    2.自定义排序,本质就是抽象的一个排序需求,自己定义排序规则即可

    class Solution:
        def minNumber(self, nums: List[int]) -> str:
            nums=list(map(str,nums))
            for i in range(len(nums)):
                for j in range(i+1,len(nums)):
                    if nums[i]+nums[j]>nums[j]+nums[i]:
                        nums[i],nums[j]=nums[j],nums[i]
            return ''.join(nums)
    
    class Solution:
        def minNumber(self, nums: List[int]) -> str:
            nums=list(map(str,nums))
            def helper(x,y):
                a,b=x+y,y+x
                if a>b:return 1
                elif a<b:return -1
                else:return 0
            nums.sort(key=functools.cmp_to_key(helper))
            return ''.join(nums)
    
    
    

     

    展开全文
  • 什么是旋转数组呢,就是将一个数组前几个元素和后面几个元素互换位置。例如原数组(升序数组)为{0,1,2,3,4,5,6,7,8,9},将旋转后变为{5,6,7,8,9,0,1,2,3,4}。如何求该数组最小值呢,有一...

    发现还是数组这种最简单的编码才适合我,遇到树,链表这些真的是一头雾水,自己也不知道怎么实现。言归正传,该篇文章介绍如何求旋转数组的最小值,求最大值可以适当改编即可。

    什么是旋转数组呢,就是将一个数组的前几个元素和后面几个元素互换位置。例如原数组(升序的数组)为{0,1,2,3,4,5,6,7,8,9},将其旋转后变为{5,6,7,8,9,0,1,2,3,4}。如何求该数组的最小值呢,有一种方法是直接按顺序比较,但是这就体现不出旋转数组的特性了,所以更好的解法应该是采用二分法来求得该数组的最小值。我们可以发现在旋转数组中9坐标的数都比它小,右边的数也都比它小。我们设有2个指针,左指针指向最左边的元素,右指针指向最右边的元素。我们判断中间的元素和最左边元素的大小,如果中间的数大于左指针指向的元素,证明最小的数字在中间数字的右边。这样我们就可以缩小范围啦。

    代码如下

    #include<iostream>
    #include<cstdlib>
    #include <stack>
    #include <stdio.h>
    #include<time.h>
    
    using namespace std;
    
    int Min(int a[], int length)
    {
    	if (a == nullptr || length <= 1)       //如果出现数组中只有一个元素的就直接报错吧
    		throw new exception("Invalid parameters");
    
    	int left = 0;
    	int right = length - 1;
    	while (a[left] > a[right])           
    	{
    		if (right <= left+2)             //数组中有2个或者三个元素,最右边的元素都是最小的
    			return a[right];
    
    		int mid = (left + right) / 2;
    		if (a[mid] >= a[left])
    			left = mid;
    		else if (a[mid] < a[right])
    			right = mid;
    
    	}
    	return a[right];
    }
    
    int main()
    {
    	int a[] = { 44,45,46,1,2,3,15,33,41 };
    	int min=Min(a, 6);
    	cout << min << endl;
    	system("pause");
    
    }
    

    不过很显然这种方法不是很完善的,因为没有考虑一种比较特殊的情况,就是数组中拥有重复元素的时候。比如数组{1,1,1,0,1},{1,0,1,1,1}。这种时候就只能选择顺序查找的办法啦。

    改进代码如下:

    #include<iostream>
    #include<cstdlib>
    #include <stack>
    #include <stdio.h>
    #include<time.h>
    
    using namespace std;
    
    int MinInOder(int a[], int left,int right)
    {
    	int result = a[left];
    	for (int i = left+1; i < right; i++)
    	{
    		if (a[i] < result)
    			result = a[i];
    	}
    	return result;
    }
    
    int Min(int a[], int length)
    {
    	if (a == nullptr || length <= 1)
    		throw new exception("Invalid parameters");
    
    	int left = 0;
    	int right = length - 1;
    	while (a[left] >=a[right])
    	{
    		if (right <= left+2)
    			return a[right];
    		     
    		int mid = (left + right) / 2;
    		if (a[right] == a[left]
    			&& a[mid] == a[right])
    			return MinInOder(a, left,right);
    		if (a[mid] >= a[left])
    			left = mid;
    		else if (a[mid] <= a[right])
    			right = mid;
    
    	}
    	return a[right];
    }
    
    int main()
    {
    	int a[] = { 1,1,1,1,0,1,1,1,1 };
    	int min=Min(a, 6);
    	cout << min << endl;
    	system("pause");
    
    }
    

     

    展开全文
  • 牛客网上剑指offer原题:输入n个整数,找出其中最小的K个。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字1,2,3,4。 解法很多个人想到的四种下面一一记录下来: 1、直接暴力解决使用数组自带的排序完后,取...


    牛客网上剑指offer原题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

    解法很多个人想到的四种下面一一记录下来:

    1、直接暴力解决使用数组自带的排序完后,取其前k个,这种时间复杂度很高为:O(k*nlog2n)解法很简单不想解释。

    2、冒泡排序外层循环的终止条件为i<k,时间复杂度为O(n*k)也很简单自己写

    3、堆排序先循环建个大顶堆别问我为什么不用小顶堆,因为大顶堆在调整的时候会找到最小的数字然后将其放在数组的最后 时间复杂度O(klog2n),代码如下:

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
            int length = input.length;
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(length==0||k<=0||k>length)		return list;
            for(int i=0;i<k;i++){//循环建堆
                BuildMaxHeap(input,length-1-i);
                swap(input,0,length-1-i);//每次将找到的最小值放在数组的最后
                list.add(input[length-1-i]);//将找到的最小值放入容器准备返回
            }
            return list;
        }
        public void swap(int[] a,int i,int j){
            int temp = a[i];
            a[i]=a[j];
            a[j]=temp;
        }
        
        public void BuildMaxHeap(int[] a,int lastindex){
            int k ;
            for(int i=(lastindex-1)/2;i>=0;i--){
                k = i;						//k表示待插入的索引
                while((k*2+1)<=lastindex){			
                    int index = k*2+1; 				//index表示k节点的左子节点
                    if(index<lastindex&&a[index]>a[index+1])	index++;	//若右子节点更小则索引指向右子节点,索引一定指向更小的子节点
                    if(a[k]>a[index]){
                        swap(a,k,index);
                        k = index;
                    }
                    else{
                        break;
                    }
                }
            }
        }
    }
    4、使用快速排序找到n的位置,使得比n小的数字个数为K个,时间复杂度平均为:O(n) ,需要修改原数组:

    import java.util.ArrayList;
    public class Solution {
           public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
    		ArrayList<Integer> list = new ArrayList<Integer>();
    		if(input.length==0||k>input.length||k<=0)	return list;
    		int low=0;
    		int high = input.length-1;
    		int index = partition(input,low,high,k);
    		while(index!=k-1){
    		if(index>(k-1)){//若index不为所求的K,则向前后调整
    			high = index-1;
    			index = partition(input,low,high,k);
    		}
    		if(index<(k-1)){
    			low = index+1;
    			index = partition(input,low,high,k);
    		}
    		}
    		for(int i=0;i<k;i++){
    			list.add(input[i]);
    		}
    		return list;
    	}
    
    	private int partition(int[] a, int low, int high, int k) //一次快排
    		int pivot = a[k-1];
    		a[k-1] = a[low];
    		while(low<high){
    		while(low<high&&a[high]>=pivot)		high--;
    		a[low] = a[high];
    		while(low<high&&a[low]<=pivot)		low++;
    		a[high] = a[low];
    		}
    		a[low] = pivot;
    		return low;
    	}
    }



    展开全文
  • /*什么是辗转相除法呢? 比如求x,y最大公约数, 先讨论(x%y)余数b是否等于0, 如果, 则y为最大公约数; 否则将y值赋给x, 把b值赋给y然后再继续对b讨论, 一直循环下去直到b=0时, y值就是所求最大公...

    /*什么是辗转相除法呢?

    比如求x,y的最大公约数,

    先讨论(x%y)的余数b是否等于0,

    如果是,

    则y为最大公约数;

    否则将y的值赋给x,

    把b的值赋给y然后再继续对b讨论,

    一直循环下去直到b=0时,

    y值就是所求的最大公约数了。

    其实现代码如下:*/

    #include <iostream>

    using namespace std;

    int main()

    {

        int a,b,num1,num2,temp;

        cout<<"请输入两个整数:"<<endl;

        cin>>num1>>num2;

        if (num1>num2)

        {

            temp=num1;

            num1=num2;

            num2=temp;

        }

        a=num1;

        b=num2;

        while (b!=0)//采用辗转相除法求最大公约数

        {

            temp=a%b;

            a=b;

            b=temp;

        }

        cout<<"最大公约数为:"<<a<<endl;

        cout<<"最小公倍数为:"<<num1*num2/a<<endl;

        system("pause");

        return 0;

    }




    展开全文
  • 这个我拿到第一个想法吧数字变成字符串,然后用字符串比较。看了答案竟然用排序函数做,排序函数sort真的是万能。还有在比较两个字符串大小时候,我思路一直从字符串里拿元素比较大小,答案...
  • 判断一个值是否可以构造出来,取一个最小的值判断是否小于等于被构造的值,首先确定加入上一个最小值后的那个总和可以被构造出来的,那么加入新的最小值扩充了这个sum求和,如,1,1,1,1,1的sum为...
  • 最小相位延时系统和全通系统1. 系统相位2. 最小相位延时系统2.1 最小相位延时系统2.2 最小相位延时系统的性质3. 全通系统3.1 定义与系统函数3.2 全通...顾名思义,就是对输入信号的相位移动延时最小的系统。 对于第一
  • 这种类似问题话,把二分图一部分(黑点)连S,容量为价值,另一部分(白点)连T,容量也是其价值。 因为上面边存在我们在最小时候需要割断一些边表示这个点不被取到。 但是这个和最大权闭合子图有...
  • 如果有一个为0,取其中非0的数;都为0,取0。最小深度从根节点到最近叶子节点的最短路径上的节点数量。注意叶子节点。什么是叶子节点,左右孩子都为空的节点才叶子节点. class Solution(object): def ...
  • 首先题主应理解到格式控制符意义一般格式...2. [width]将指定的最小字符复制到输出缓冲区。宽度字段是非负整数。宽度规范不会导致值被截断;如果输出值中字符大于指定宽度,或者宽度字段不存在,则根据精...
  • 什么是前缀树、前缀树基本特征、前缀树应用、 所谓字典树又被称为前缀树或者叫做trie树,处理字符串常用数据结构。优点利用字符串公共前缀来 节约存储空间。基本性质如下: (1)根节点没有字符...
  • 和为S两个数字

    2018-11-14 20:02:04
    输入一个递增排序的数组和一个数字S,在数组中查找两个,使得他们的和正好S,如果有多对数字的和等于S,输出两个的乘积最小的。 输出描述: 对应每个测试案例,输出两个,小的先输出。  在写解法之前,...
  • 更多精彩文章请访问我个人博客(zhuoerhuobi.cn) 给定一个二叉树,找出其最小...不过解法中巧妙一点,由于节点val值并没什么用,所以我拿来存储当前节点所在层,巴适! Java实现 import java.util.LinkedL.
  • 数值类型: 虽然面向对象语言,但是在使用上数值类型还是必不可少...2、整数常量说起来被认为int型,但是在编译时,可以认为编译器将看作能表示该数的最小数值,因此byte b = 100;不会报错。引用类型: ...
  • 展开全部1、描述的对象不同:字(word)用于表62616964757a686964616fe4b893e5b19e...字符电子计算机或无线电通信中字母、数字、符号的统称,其是数据结构中最小的数据存取单位,通常由8个二进制位(一个...
  • 一、简介 1. 什么是最小生成树 将一个有权图中的所以顶点都连接起来,并保证连接的边的总权重最小,即最小生成树(mini spanning ...我们使用阴影边连接了所有的顶点,并保证了总权重是最小的。 注意最小生成树...
  • 我们先来回忆一下树和图结构都是什么: 树:每一个节点有且仅有一个父节点,拥有数量可以为零子节点,便是一个树形结构,如下图: 图:每一个节点都可以和任意个节点相连,如下图: 但这两种结构并不是...
  • 1 题目描述 给定一个整数 n ,你需要...如果有多个结果,返回最小的那个。 2 解题思路 太痛苦了,要考虑的情况好多,做出来也没什么成就感。基本上提交后根据错误进行修改,一直改对的。再也不想做这类题了。 上图...
  • 根据国家标准、目前市场上销售电子秤衡器精度等级为( III )级秤,鉴定分度一般为3000 分度(分读在2000-10000之间),其最小分度值根据秤量大小从1g 至50kg 不等。中准确度等级III 电子秤...
  • 即在程序初始化时候创建一定数量数据库连接,用完可以放回去,下一个在接着用,通过配置连接池参数来控制连接池中初始连接最小连接、最大连接、最大空闲时间这些参数保证访问数据库数量在一
  • 展开全部电子秤分度值...根据国家标准、目前市场上销售电子秤衡器精度等级为( III )级秤,鉴定分度一般为3000 分度(分读在2000-10000之间),其最小分度值根据秤量大小从1g 至50kg 不等。中准确度等级II...
  • 如果您需要说服管理层,为什么最好在多个阶段中部署更大更改并将逐步推向客户,请继续阅读。 部署许多更改有风险。 因此,我们希望以最小化对客户和公司造成伤害风险方式来部署它们。 部署可以一次...
  • 千次阅读 2013-06-22 21:13:58
    从这一程序中可以看出,Msk的最小字节数是MIN_MSK_LEN,即20。采用魔数危害有: 1) 降低了程序可读性。有人可能会提出,那加一些注释不就完了吗?如果真是采用加注释方式,那为什么不将定义成一个宏或是
  • 但是动态规划一直笔者心中痛点,大厂笔试中动态规划已成标配,为了圆大厂梦,笔者决定沉下心,认真研究一下动态规划问题,近日看到leetcode一位大佬将动态规划问题划分为五类,私以为很受用,加上一些个人见解...
  • 什么是

    2020-05-14 18:40:19
    其中,我们把根节点最大的堆叫做大顶堆,根节点最小的堆叫做小顶堆。 堆详解 满二叉树 满二叉树指所有层都达到最大节点的二叉树。比如,下面这颗树: 完全二叉树 完全二叉树指除了最后一层其它层都达到...
  • 什么是深度?什么是高度,一张图让你弄明白!我们暂时以二叉树为例。 二叉树最大高度 给定一个二叉树,找出最大深度。 二叉树深度为根节点到最远叶子节点最长路径上节点。 说明: 叶子节点指...
  • 一个红外系统性能经常以探测范围来区别,以及最小等效温差指标。首先探测范围,就是常说动态范围,意思探测器能够检测到温度红外信号范围。然后是最小等效温差,意思探测器能够检测到的最小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 598
精华内容 239
关键字:

其数最小的数是什么