1. 程式人生 > >查詢陣列中是否存在任意三個數可組成三角形的演算法

查詢陣列中是否存在任意三個數可組成三角形的演算法

分治法:

先把陣列一a[i]為界,分成兩部分,左邊比a[i]小,右邊比a[i]大。

接下來問題就變成了兩個子問題,左右兩個子陣列,再加上一下這三種情況:

1:左面陣列去一個數、右面陣列取一個數,a[i]三個數判斷;

2:左面取兩個數與a[i]判斷;

3:右面取兩個數與a[i]判斷;

程式碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

void swap(int *a,int *b){
    int c=*a;
    *a=*b;    
    *b=c;
}
int valid(int a,int b,int c)
{
    return a+b>c && a+c>b && b+c>a;
}
int partion(int * a,int p,int q)//快排
{
    int i,j;
    for(i = p-1,j = p;j<q;++j)
    {
        if(a[j] < a[q] && a[++i]> a[q])//i——j之間的值為大於a[q]的值,i以前的都是比a[q]的值小的值。
            swap(&a[i],&a[j]);
    }
    swap(&a[i+1],&a[q]);
    return i+1;
}
int subtri(int * a,int p,int q)
{
    int mid;
    if(q-p+1 < 3)return 0;
        mid = partion(a,p,q);
    if(subtri(a,p,mid-1)||subtri(a,mid+1,q))return 1;
    else
    {
        int l,r;
        for(l = p;l<mid;l++)
            for(r = mid+1;r <= q;++r)
            {
                if(valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = p;l<mid;l++)
            for(r = p;r<mid;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = mid+1;l<=q;l++)
            for(r = mid+1;r<=1;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
    }
    return 0;
}
int main()
{
    int a[] = {4,4,1,2,3,5,7,8,9};
    printf("%d",subtri(a,0,8));
    return 0;
}

相關推薦

查詢陣列是否存在任意個數組成三角形演算法

分治法: 先把陣列一a[i]為界,分成兩部分,左邊比a[i]小,右邊比a[i]大。 接下來問題就變成了兩個子問題,左右兩個子陣列,再加上一下這三種情況: 1:左面陣列去一個數、右面陣列取一個數,a[i]三個數判斷; 2:左面取兩個數與a[i]判斷; 3:右面取兩個數與a[i

查詢陣列最大的兩個數(Find two Largest Number)

程式設計的確是個循序漸進的過程,有了基礎班,稍微改改就可以新增新功能了,不錯,不錯! 程式碼如下: //JHTP Exercise 4.22: Find two Largest Number //

空間任意個點組成三角形面積

問題1:遍歷所有可能的3個點 1 2 3 for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) for(int k = j + 1; k

快速查詢陣列“和”為X的兩個數

快速判斷在一個數組中,是否存在兩個數字,讓這兩個數字之和等於一個給定的值 X。 以陣列 arr[] = {11, 15, 6, 8, 9, 10} 為例: 當x = 16時, 存在兩個數字的和為16: (6, 10) 輸出: true 當x = 35時, 存

拼多多筆試題一:給出一個無序整數陣列,求任意個數的最大乘積

題目: 給出一個可能包含正數、零、負數的無序整數序列,從該序列中任選三個數計算乘積,求最大的乘積是多少? 要求:演算法的時間複雜度為O(n),空間複雜度為O(1). 輸入: 第一行輸入n表示序列中整數的個數 第二行輸入n個整數 輸出; 最大的乘積 例如: 輸入: 4 1 0

查詢陣列個數 出現的次數

陣列 int[] arr = {1, 1, 1, 33, 3}; //查出來數中數字 一共出現了幾次 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //定義一個

Bit-Map實現查詢陣列的重複數字

Bit-Map中文翻譯為點陣圖,其實和本文所謂的Bit-Map是有出入的。 所謂的Bit-Map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由於採用了Bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。 查詢一個數組中的重複數字,假設陣列時從0

整型陣列只有一個或兩個數出現一次,其它的數都出現偶數次

Question: 一個整型數組裡只有一個或兩個數字之外,其他的數字都出現了偶數次。求這個或這兩個只出現一次的數字 解: 題中關鍵資訊為其它數字出現偶數次,想到異或運算的性質知一個數與自身偶數次異或結果為0,可知如果將陣列中所有的數字進行異或,則結果等於這兩個只出現一次的數字的異或

No.26 我與程式碼的日常:逆轉整數,迴文字串,迴文數字,查詢陣列遺漏數字,判斷2的冪

學習不易,需要堅持。 逆轉整數:Reverse Integer Example1: x = 123, return 321 Example2: x = -123, return -321 處理溢位: 比如整數最大值2147483647逆轉之後的整數值不存在 要求所有值逆轉之後再

關於查詢陣列最小的k個元素的解答 updated

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

查詢陣列重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)

這是我BIGO前端面試時,面試官給我出的一道題,題目是長度為N的陣列,元素大小範圍在[1,N-1],只有一個重複的元素,用O(n)的時間複雜度和O(1)的空間複雜度找出來這個重複的元素, 大致思路 1、因為總共有N個數,每個數的範圍是1到N-1,只有一個重複的數,所以這些數肯定是連續的           2

查詢陣列的眾數

查詢陣列中出現次數最多的數 示例一 int most_(vector<int> arr) { int len = arr.size(); vector<int> tmp(le

二分法查詢陣列元素的位置

基本思想: 假設資料是按升序排序的,對於給定值key,從序列的中間位置mid開始比較,如果當前位置array[mid]值等於value,則查詢成功;若key小於當前位置值array[mid],則在數列的前半段中查詢,array[low,mid-1];若value大於當前位置

牛客網 查詢陣列的重複元素

找出陣列 arr 中重複出現過的元素 題目描述: 找出陣列 arr 中重複出現過的元素 示例1 輸入 [1, 2, 4, 4, 3, 3, 1, 5, 3] 輸出 [1, 3, 4] 思路: 1.遍歷原陣列arr,建立變數flag=false,將arr中的每個元

查詢陣列出現次數最多的元素

1.查詢陣列中每一個元素出現的次數 var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; var countedNames = names.re

利用二分法結合遞迴查詢陣列的元素的下標

注意:由於二分法只適用於有序陣列的元素查詢,對於無序陣列,我們必須先對其進行排序。 陣列可由Math.random()方法結合迴圈自動生成一個固定長度的int陣列,然後呼叫Arrays.sort()方法對其排序,然後得到我們想要的有序int陣列 第一種方法:不使用遞迴 import ja

查詢陣列重複次數最多的數字

題目: 給定一個大小為n的陣列,該陣列包含數字的範圍在 [0...k-1], k是一個正整數,k < = n。在這個陣列找到重複次數最多的數字。 要求時間複雜度為n,空間複雜度為1,可以使用原陣列。 原理: 遍歷陣列,讓每個元素作為下標的元素加k,最後誰的值最大,則它

找出陣列出現一次兩個數,其他數字都出現偶數次

{      unsigned int flag =1;      while(flag) //求異或結果,最低的為1的二進位制位,根據此位是否為1,將元素分為兩組,兩個不同的元素,在此位必然,一個為1,一個為0 {        if(flag&sum)           break;      

求無序陣列最大的K個數 或 第K大的數

1、方法一:要求無序陣列中沒有重複元素,同時允許更改陣列內的內容。主要思想是利用快速排序Partition函式依次進行前K個元素的排序,平均時間複雜度O(n)。#include <iostream> #include <string> #in

bfprt演算法----找出陣列最小的k個數(Java)

 無序陣列中最小的k個數 對於一個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數。 給定一個整數陣列A及它的大小n,同時給定k,請返回其中最小的k個數。 測試樣例: [1,2,4,3],4,2 返回:[1,2] (1)利用堆,時間複雜度O(Nlog