几道算法题练习下

简介: 《基础系列》

买卖股票问题:题目: 你有一个数组,第i个元素表示第i天某个股票的价格,设计一个算法找到最大的利润,并且你只能最多完成两次交易。

参考地址:没有完全理解的

http://www.mamicode.com/info-detail-1087177.html

http://www.mamicode.com/info-detail-1087177.html


/**

 * 解题思路:

 * 比如给定一组数组,[1,2,3,6,9,3,10]

 * 最多可以2次去获取最大的利益,可以用2分的思想,分成2部分,

 * 从0元素开始遍历分别求出左右2边的最大利益,求出的左右2边最大的利益即为解

 */

classSolution {

 

    publicstaticintmaxProfit(int[] prices) {

        // write your code here

        if(null==prices||0==prices.length) return0;

         intsumProfit = 0;

         for(inti=1;i<prices.length;i++){

              inttmpsum = maxProfit(prices, 0, i)

                + maxProfit(prices, i+1, prices.length-1);

              sumProfit = Math.max(sumProfit, tmpsum);

         }

         returnsumProfit;

    }

    publicstaticintmaxProfit(int[] prices,ints,inte){

         if(e<=s) return0;

         intmin = prices[s];

         intmaxProfit = 0;

         for(inti=s+1;i<=e;i++){

              maxProfit = Math.max(maxProfit, prices[i]-min);

              min = Math.min(min, prices[i]);

         }

         returnmaxProfit;

    }

    publicstaticvoidmain(String[] args) {

     intarr [] =  {4,4,6,1,1,4,2,5};

     System.out.println(maxProfit(arr));

}

}


[编程]任给n个整数和一个整数x。请计算n个整数中有多少对整数之和等于x。


publicclassTest8 {

publicstaticvoidmain(String[] args) {

//输入n个整数和一个整数

Scanner input = newScanner(System.in);

System.out.println("请输入n个整数,数量任意,以逗号分隔");

String str = input.next();

System.out.println("请输入一个整数:");

intx = input.nextInt();

//将n个整数的字符串转换为数组

String arr1[] = str.split(",");

int[] arr2 = newint[arr1.length];

for(inti=0;i<arr1.length;i++){

arr2[i] = Integer.parseInt(arr1[i]);

}

System.out.println(Arrays.toString(arr2));

//判断并输出n个整数中有几对的和等于x

intcount = 0;

for(inti=0;i<arr2.length-1;i++){

for(intj = i+1;j<arr2.length;j++){

if(arr2[i]+arr2[j]==x){

count++;

}

}

}

System.out.println(count);

}

}


[编程]请说明快速排序算法的设计思想和时间复杂度,并用高级语言写出对整数数组进行一趟快排的函数实现。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2、以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3、从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。


publicclassQuick {

publicstaticvoidmain(String[] args) {

intarr [] = {90,60,70,50,40,80,20,100,10};

sort(arr,0,arr.length-1);

System.out.println(Arrays.toString(arr));

}

publicstaticvoidsort(intarr[], intlow, inthigh) {

//设置两个变量l、h,排序开始的时候:l=0,h=N-1

intl = low;

inth = high;

//以第一个数组元素作为关键数据,赋值给key,即key=A[0]

intkey = arr[low];

//重复操作,直到i=j

while(l < h) {

//从h开始向前搜索,即由后开始向前搜索(h--),找到第一个小于key的值arr[h],将arr[h]和arr[l]互换

while(l < h && arr[h] >= key)

h--;

if(l < h) {

inttemp = arr[h];

arr[h] = arr[l];

arr[l] = temp;

l++;

}

//从l开始向后搜索,即由前开始向后搜索(l++),找到第一个大于key的arr[l],将arr[l]和arr[h]互换;

while(l < h && arr[l] <= key)

l++;

 

if(l < h) {

inttemp = arr[h];

arr[h] = arr[l];

arr[l] = temp;

h--;

}

}

//对前一部分进行快速排序

if(l > low)

sort(arr, low, l - 1);

//对前一部分进行快速排序

if(h < high)

sort(arr, l + 1, high);

}

}

相关文章
|
7月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
7月前
|
并行计算 算法 测试技术
模拟算法题练习(一)(扫雷,灌溉,回文日期)
模拟算法题练习(一)(扫雷,灌溉,回文日期)
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
|
7月前
|
算法 图形学
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
436 0
|
算法 前端开发
算法练习--深拷贝与浅拷贝
深拷贝与浅拷贝
76 0
|
7月前
|
存储 算法 搜索推荐
Leetcode算法题练习(一)
Leetcode算法题练习(一)
89 0
|
算法 Java
Java之包装类的算法小题的练习
Java之包装类的算法小题的练习
76 0
算法练习Day56|583. 两个字符串的删除操作 ● 72. 编辑距离
算法练习Day56|583. 两个字符串的删除操作 ● 72. 编辑距离